Я разрабатываю приложение Qt5, которое включает виджет, роль которого состоит в том, чтобы показать пользователю список объектов (вертикальный список, один столбец), каждая запись содержит 3 или 4 атрибута. Мне также нужно повторно использовать пользовательский виджет, который был разработан для представления каждого объекта. Моей первой мыслью было использовать QListView
, но похоже, что они обрабатывают только один атрибут. Кто-нибудь знает, предлагает ли Qt способ представить список виджетов, представляющих несколько атрибутов, в одном представлении списка?
Qt — QListView с пользовательским виджетом, представляющим несколько атрибутов
comment
Почему вы не подумали о виде дерева. Узлы верхнего уровня представляют ваши элементы. Каждый узел имеет дочерние узлы, которые представляют его атрибуты. Другими словами, это будет двухуровневая иерархия.
- person vahancho   schedule 08.02.2018
Ответы (2)
Я вижу три варианта:
- Используйте
QTreeView
, который предлагает несколько столбцов. Они не похожи на электронную таблицу, какQTableVeiw
, а больше похожи на список. Вам не нужно использовать древовидную структуру, чтобы использовать его, он будет отлично отображать списки или таблицы. - Используйте пользовательский
QStyledItemDelegate
и самостоятельно визуализируйте все атрибуты в одной ячейке. Вы даже можете использовать пользовательский виджет в качестве основы для рендеринга. Однако у вас будет только один его экземпляр, и он никогда не будет отображаться. Поэтому убедитесь, что пользовательский виджет в любом случае будет отображаться правильно и что его обновление будет быстрым. Вы должны изменить его данные для каждой отображаемой ячейки. - Если вам действительно нужно использовать пользовательский виджет, просто сделайте это. Создайте по одному элементу и поместите их все в
QBoxLayout
. Если вы пойдете по этому пути и у вас будет огромное количество предметов, вы столкнетесь с проблемами производительности. Если вы действительно столкнулись с этим и действительно хотите пойти по этому пути, ознакомьтесь с библиотекой, которую я написал именно для этой цели: лонгскролл-qt.
person
SteakOverflow
schedule
08.02.2018
Я считаю, что вам нужно QListWidget
, которое я искал последние несколько дней :(
вот как я его использую:
#include <QListWidget>
#include <QPointer>
class MyObjectListWidget : public QListWidget
{
public:
MyObjectListWidget(QWidget *parent=nullptr);
bool addMyObject(QPointer<MyObject> obj);
private:
QList<QPointer<MyObject>> my_objects;
};
и в файле cpp:
bool MyObjectListWidget::addMyObject(QPointer<MyObject> obj){
if(!obj.isValid())
return false;
auto item = new QListWidgetItem(this);
addItem(item);
auto row = new MyObjectItemWidget(obj,this);
item->setSizeHint(row->minimumSizeHint());
setItemWidget(item,row);
my_objects.push_back(obj);
return true;
}
MyObjectItemWidget
— это мой пользовательский виджет с файлом .ui
, который помогает генерировать представление и принимает пользовательский объект в качестве аргумента с именем MyObject
.
person
Ebrahim Karimi
schedule
13.10.2020