Qt — QListView с пользовательским виджетом, представляющим несколько атрибутов

Я разрабатываю приложение Qt5, которое включает виджет, роль которого состоит в том, чтобы показать пользователю список объектов (вертикальный список, один столбец), каждая запись содержит 3 или 4 атрибута. Мне также нужно повторно использовать пользовательский виджет, который был разработан для представления каждого объекта. Моей первой мыслью было использовать QListView, но похоже, что они обрабатывают только один атрибут. Кто-нибудь знает, предлагает ли Qt способ представить список виджетов, представляющих несколько атрибутов, в одном представлении списка?


person RAM    schedule 08.02.2018    source источник
comment
Почему вы не подумали о виде дерева. Узлы верхнего уровня представляют ваши элементы. Каждый узел имеет дочерние узлы, которые представляют его атрибуты. Другими словами, это будет двухуровневая иерархия.   -  person vahancho    schedule 08.02.2018


Ответы (2)


Я вижу три варианта:

  1. Используйте QTreeView, который предлагает несколько столбцов. Они не похожи на электронную таблицу, как QTableVeiw, а больше похожи на список. Вам не нужно использовать древовидную структуру, чтобы использовать его, он будет отлично отображать списки или таблицы.
  2. Используйте пользовательский QStyledItemDelegate и самостоятельно визуализируйте все атрибуты в одной ячейке. Вы даже можете использовать пользовательский виджет в качестве основы для рендеринга. Однако у вас будет только один его экземпляр, и он никогда не будет отображаться. Поэтому убедитесь, что пользовательский виджет в любом случае будет отображаться правильно и что его обновление будет быстрым. Вы должны изменить его данные для каждой отображаемой ячейки.
  3. Если вам действительно нужно использовать пользовательский виджет, просто сделайте это. Создайте по одному элементу и поместите их все в 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