【问题标题】:QSortFilterProxyModel how to handle QStandardItems correctlyQSortFilterProxyModel 如何正确处理 QStandardItems
【发布时间】: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


【解决方案1】:

我用那个改变了我的代码:

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 我已经为 QtreeView 加载“原始”模型并显示它。当我在 QListEdit 中编辑文本时,我使用 proxyModel(来自第 1 篇文章的代码)。编辑文本时,我在 QtreeView 中选中了复选框(现在 proxyModel 处于活动状态),在这一步一切正常。但是当我在 UI 中进行一些更改时,在 QTreeView 中设置了原始模型,并且它没有为 proxyModel 所做的任何更改。如何使用来自 proxyModel 的新数据通知和更新源模型中的项目?

UPD3是的,源模型也被修改了……我刚刚清除了)

【讨论】:

  • 您能否提供更多代码或更准确地描述您想要的内容?据我了解,您想在模型中过滤某些字符串的数据,这就是为什么您使用 QLineEdit 输入过滤字符串并设置代理模型的原因。您的 QStandardItems 是可检查的。但是,我不明白“在 proxyModel 中选中复选框时如何更新源模型”。你想要什么?当您选中 QTreeView 中的复选框时,您的 QStandartItem 检查状态将发生变化。它是源模型。源模型将被更新。
猜你喜欢
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多