我有一些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有什么问题这个......
答案 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 是的,源模型也被修改了......我刚刚清楚了一下)