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

我使用几个 View ,这些 View 使用从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)

最佳答案

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

  • 重新实现QAbstractProxyModel
  • 重新实现QAbstractItemModel并为此 View 创建另一个模型。

  • 第三种可能的解决方案是为 View 重新实现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"
    

    07-26 08:47