Сложный контент в QTableView
Мы хотели бы сделать TableView, который позволяет сложный контент в своих ячейках. TableView должен быть настолько общим, чтобы я мог делать простые вещи, как на рисунке 1. Левое изображение - простой пример, где я заполняю простую TableModel, устанавливаю его для TableView и отображаю его.
Но что, если я хочу добавить более сложный контент в одну ячейку? Пожалуйста, еще раз посмотрите на первое изображение. Правая часть более сложная, для каждой ячейки мы хотим отобразить изображение, описание и другое описание, поэтому три элемента в одной ячейке.
Я понимаю, что я могу поместить виджеты в ячейки TableView. Но если я хочу иметь правильную TableModel в фоновом режиме, как я буду хранить данные?
Сверху, представление должно автоматически изменить размер, когда я уменьшу виджет TableView, содержимое должно адаптироваться
Поэтому, если я использую TableView и хочу изменить размер, мне придется переложить содержимое из одного столбца в другой. Из того, что я понимаю, столбцы также определяют макет.
Было бы лучше, если бы я использовал QGridLayout для этой цели? Должен ли я определить совершенно новую модель для QGridLayout?
Спасибо за любую помощь! Я новичок в QT и буду признателен за ваш вклад!
1 ответ
Предложенное Qt решение для того, чтобы иметь сложное представление в каждой ячейке табличного представления, состоит в том, чтобы использовать собственный делегат. Взгляните на пример Star Delegate, он демонстрирует именно эту технику.
По сути, есть два варианта продолжения работы с пользовательским делегатом: либо вы подкласс QStyledItemDelegate (или его базовый класс QItemDelegate, если вам нужно рисовать элементы типов данных Qt несколько специально), либо подкласс QAbstractItemDelegate, чтобы иметь полный контроль над внешним видом и поведением делегата.
Тем не менее, ваше второе требование автоматической перестановки макета при изменении размера виджета предполагает, что ваше представление не обязательно должно следовать схеме базовой таблицы. В Qt есть пример компоновки потока, который реализует компоновку именно с этим свойством переупорядочить при изменении размера, и я предполагаю, что самым простым подходом было бы просто использовать эту компоновку вместе с пользовательскими виджетами, представляющими ячейки модели таблицы. Чтобы это произошло, вы можете реализовать собственный класс представления, слушая сигналы модели, создавая / удаляя виджеты и обновляя макет потока по мере необходимости. Эта книга, хотя и немного устаревшая в настоящее время, так как охватывает Qt4, содержит главу (#6) о реализации пользовательского представления, которое не является подклассом QAbstractItemView
но это всего лишь виджет, обновляющий себя как обновления базовой модели. Для меня это правильный подход к вашей проблеме.