QSortFilterProxyModel如何正确处理QStandardItems

时间:2016-07-13 06:10:33

标签: c++ qt qtreeview qstandarditemmodel qsortfilterproxymodel

我有一些QTreeView项目,并在textEdited信号上搜索连接槽的QLineEdit。 使用此代码:

QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(messagesModel);
proxyModel->setFilterFixedString(text);
ui.treeView->setModel(proxyModel);

文本过滤是可以的,但是当我点击QTreeView QStandardItems复选框时(在分配给QTreeView的代理模型之后),我让程序在插槽中崩溃,连接到此QTreeView原始模型(在分配代理之前)。 处理项目复选框点击的正确方法是什么?我需要使用新的连接/插槽来处理模型更改,或者我可以对原始模型使用相同的代码并进行一些更改吗?我只需要在QTreeView中隐藏过滤的项目。在QTreeWidget中是hide()方法,QTreeView有这样的东西,还是QSortFilterProxyModel - 我需要什么? THX!

UPD 在插槽中崩溃,连接到treeView:

auto item = messagesModel->itemFromIndex(index); // item is NULL because proxyModel is set for TreeView now
if(item->whatsThis().isEmpty()) return;    // error below

#ifndef QT_NO_WHATSTHIS
    inline QString whatsThis() const {
        return qvariant_cast<QString>(data(Qt::WhatsThisRole));
    }
    inline void setWhatsThis(const QString &whatsThis);
#endif

因为我将proxyModel设置为treeView,但是messagesModel有什么问题这个......

1 个答案:

答案 0 :(得分:0)

我改变了我的代码:

QStandardItem* item;
if(ui.leFilter->text().isEmpty())
    item = messagesModel->itemFromIndex(index);
else
    item = messagesModel->itemFromIndex(proxyModel->mapToSource(index));
if(item->whatsThis().isEmpty()) return;

它有效。这是正确的方法吗?代理模型是我的UI类的成员......不是本地的。

UPD 如何在proxyModel中选中复选框时更新源模型?

UPD 2 我已加载&#34;原创&#34; QtreeView的模型并显示它。当我在QListEdit中编辑文本时,我使用proxyModel(第一篇文章中的代码)。编辑文本时,我在QtreeView中检查了复选框(现在proxyModel处于活动状态)并且在此步骤中一切正常。但是当我在UI中进行一些更改时,在QTreeView中设置原始模型并且它没有为proxyModel进行任何更改。如何使用来自proxyModel的新数据通知和更新源模型中的项目?

UPD3 是的,源模型也被修改了......我刚刚清楚了一下)