如何在QTableView中显示QAbstractItemModel的子行 [英] How to display sub-rows of QAbstractItemModel in QTableView

查看:858
本文介绍了如何在QTableView中显示QAbstractItemModel的子行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have my own class that inherits from QAbstractItemModel which has tree structure.

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

I use a couple of views, that display filtered data of this model, using classes derived from QSortFilterProxyModel.

我的模型结构如下:

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

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

Where A, B .... are "main rows" (children of the root), and A1, A2, ... B1, B2... are "children rows" - node rows appended to "main rows".

现在,我需要做的是只显示子行的QTableView:

Now, what I need to do is a QTableView that displays "children rows" only:

A1
A2
A3
B1
B2

方法我发现在QSortFilterProxyModel(filterAcceptsRow,filterAcceptsColumn),只操作主行...

But filtering methods I found in QSortFilterProxyModel (filterAcceptsRow, filterAcceptsColumn), operates on main rows only...

我如何做?

(我发现非常相似的问题,但它仍然没有回答: QTableView只显示用QAbstractItemModel实现的树模型的叶子

(I found very similar question, but it is still unanswered: QTableView to display only leaves of a tree model implemented with QAbstractItemModel)

推荐答案

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

I see 3 possible solutions for this problem. First two solutions offered Dmitry Sazonov in his comment for this question:


  1. 重新实现 QAbstractProxyModel

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

  1. Reimplement QAbstractProxyModel.
  2. Reimplement QAbstractItemModel and create another model for such view.

第三种可能的解决方案是重新实现 QStyledItemDelegate 。我为这样的解决方案做一个小例子。我希望这将是有用的:

The third possible solution is little trick with reimplementation of QStyledItemDelegate for view. I make small example for such solution. I hope, it will be useful:

#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"

这篇关于如何在QTableView中显示QAbstractItemModel的子行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆