【发布时间】:2016-11-15 13:53:07
【问题描述】:
我有带有一些项目的 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 - 是我需要的吗?谢谢!
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有whatsThis...
【问题讨论】:
-
你有一个崩溃而不是显示崩溃的代码。如果崩溃的调用堆栈未指向您的代码,请将此调用堆栈粘贴到问题中。
-
treeWidget- 真的是QTreeView,还是QTreeWidget? -
是的。抱歉 - treeWidget 必须是 QTreeView。附加崩溃的代码
标签: c++ qt qtreeview qstandarditemmodel qsortfilterproxymodel