【问题标题】:How to display sub-rows of QAbstractItemModel in QTableView如何在 QTableView 中显示 QAbstractItemModel 的子行
【发布时间】:2016-10-01 23:41:29
【问题描述】:

我有自己的类,它继承自具有树结构的 QAbstractItemModel。

我使用了几个视图,显示该模型的过滤数据,使用派生自 QSortFilterProxyModel 的类。

我的模型结构如下所示:

root
|
-- A
|  |-A1
|  |-A2
|  |-A3
|
-- B
|  |-B1
|  |-B2
|
... and so on...

其中 A, B .... 是“主行”(根的子行),而 A1, A2, ... B1, B2... 是“子行” - 附加到“主行”的节点行”。

现在,我需要做的是一个仅显示“子行”的 QTableView:

A1
A2
A3
B1
B2

但是我在 QSortFilterProxyModel (filterAcceptsRow, filterAcceptsColumn) 中找到的过滤方法只对主行起作用...

我该怎么做?

(我发现了非常相似的问题,但仍然没有答案:QTableView to display only leaves of a tree model implemented with QAbstractItemModel

【问题讨论】:

  • 你需要自己写QAbstractProxyModel。但这是一项复杂的任务,因为您需要对索引进行大量工作。我建议您在原始数据上再写一个QAbstractListModel

标签: c++ qt model-view-controller qtreeview model-view


【解决方案1】:

我看到了 3 种可能的解决方案来解决这个问题。前两个解决方案在他对这个问题的评论中提供了Dmitry Sazonov

  1. 重新实现QAbstractProxyModel
  2. 重新实现QAbstractItemModel 并为此类视图创建另一个模型。

第三种可能的解决方案是重新实现QStyledItemDelegate 以供查看的小技巧。我为这种解决方案做了一个小例子。希望对你有用:

#include <QApplication>
#include <QTreeView>
#include <QStyledItemDelegate>
#include <QStandardItemModel>

class ZeroHightItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    ZeroHightItemDelegate(QObject* parent = 0)
        : QStyledItemDelegate(parent)
    {}
    ~ZeroHightItemDelegate(){}
public:
    QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const Q_DECL_OVERRIDE
    {
        static int defaultHeight = 0;
        static bool firstSizeHintFlag = true;
        QSize size = QStyledItemDelegate::sizeHint(option, index);
        if (firstSizeHintFlag){
            defaultHeight = size.height();
            firstSizeHintFlag = false;
        }
        const QAbstractItemModel* model = index.model();
        if (!model)
            return size;
        if (model->hasChildren(index))
            size.setHeight(0);
        else
            size.setHeight(defaultHeight);
        return size;
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTreeView myView;
    myView.setRootIsDecorated(false);
    QStandardItemModel* model = new QStandardItemModel(&myView);
    myView.setModel(model);

    model->insertColumns(0, 1);
    QStandardItem* headerItem = new QStandardItem("Header");
    model->setHorizontalHeaderItem(0, headerItem);

    QStandardItem* itemA = new QStandardItem("A");
    model->appendRow(itemA);
    QStandardItem* itemB = new QStandardItem("B");
    model->appendRow(itemB);
    QStandardItem* itemA1 = new QStandardItem("A1");
    QStandardItem* itemA2 = new QStandardItem("A2");
    itemA->appendRow(itemA1);
    itemA->appendRow(itemA2);
    QStandardItem* itemB1 = new QStandardItem("B1");
    QStandardItem* itemB2 = new QStandardItem("B2");
    QStandardItem* itemB3 = new QStandardItem("B3");
    itemB->appendRow(itemB1);
    itemB->appendRow(itemB2);
    itemB->appendRow(itemB3);
    myView.setItemDelegate(new ZeroHightItemDelegate(&myView));

    myView.expandAll();
    myView.show();

    return a.exec();
}

#include "main.moc"

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多