Qt - QListView,带有代表多个属性的自定义小部件

时间:2018-02-08 07:08:46

标签: qt qt5 model-view

我正在开发一个Qt5应用程序,其中包含一个小部件,其作用是向用户显示一个对象列表(垂直列表,单列),每个条目包含3或4个属性。我还需要重用一个用于表示每个对象的自定义小部件。我的第一个想法是使用QListView,但似乎他们只处理一个属性。有没有人知道Qt是否提供了在单个列表视图中显示代表多个属性的小部件列表的方法?

2 个答案:

答案 0 :(得分:0)

我看到三个选项:

  1. 使用提供多列的QTreeView。它们看起来不像QTableVeiw那样的电子表格,但更像是列表视图。您不必使用树结构来使用它,它会显示列表或表格。
  2. 使用自定义QStyledItemDelegate并自行将所有属性渲染到一个单元格中。您甚至可以使用自定义小部件作为渲染的基础。但是,您将只有一个实例,并且它实际上永远不会显示。因此,请确保自定义窗口小部件无论如何都能正确呈现,并且更新它很快。您必须为渲染的每个单元格更改其数据。
  3. 如果您确实需要使用自定义窗口小部件,请执行此操作。每个项目创建一个,并将它们全部放在QBoxLayout中。如果你这样做并拥有大量的物品,你会遇到性能问题。如果您确实遇到过这种情况并且真的想要这样做,请查看我为此目的编写的库:longscroll-qt

答案 1 :(得分:0)

我相信,您需要的是过去几天一直在寻找的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的自定义对象作为arg。

相关问题