QSortFilterProxyModel 不更新 QTableview

Posted

技术标签:

【中文标题】QSortFilterProxyModel 不更新 QTableview【英文标题】:QSortFilterProxyModel does not update the QTableview 【发布时间】:2019-04-02 15:02:25 【问题描述】:

我正在尝试将 QSortFilterProxyModel 与 QStandardItemmodel 一起使用,但 filterAcceptedRows() 没有更新视图。

这些行在函数 filterAcceptedRows() 中被正确过滤,但视图没有更新。它仍在显示所有行。您可以在下面找到我已经尝试过的代码,有人可以告诉我我在这里遗漏了什么

这是 QDialog 中的代码。

m_modelApp = new QStandardItemModel();
m_proxyApp = new ProxyModelApp();
m_proxyApp->setSourceModel(m_modelApp);
m_lstApp->setModel(m_modelApp);

这就是我向模型添加数据的方式。

    QStandardItem *item1 = new QStandardItem();
    QStandardItem *item2 = new QStandardItem();
    QStandardItem *item3 = new QStandardItem();
    QStandardItem *item4 = new QStandardItem();
    QStandardItem *item5 = new QStandardItem();
    QStandardItem *itemCheck = new QStandardItem();

    item1->setData(l_sRefProduitSW,Qt::DisplayRole);
    item2->setData("To Define",Qt::DisplayRole);
    item3->setData(app.GetRefApp(),Qt::DisplayRole);
    item4->setData(app.GetRefIdentApp(),Qt::DisplayRole);
    item5->setData(app.GetRefFNRApp(),Qt::DisplayRole);

    itemCheck->setCheckable(true);
    if(m_xRefBe->GetListeAppBE().contains(app))
        itemCheck->setCheckState(Qt::Checked);
    else
        itemCheck->setCheckState(Qt::Unchecked);

    listItems<<itemCheck<<item1<<item2<<item3<<item4<<item5;
    m_modelApp->appendRow(listItems);

ProxyModelApp 中的过滤器之一。

void ProxyModelApp::setRefLibApp(QString refLibApp)
    if(m_refLibApp != refLibApp)
        m_refLibApp = refLibApp;
    invalidateFilter();

我想知道,为什么filterAcceptedRows()函数过滤成功后视图没有更新。

谢谢。

【问题讨论】:

尝试调用你的代理invalidateFilter() 每当我尝试过滤它时,我都会调用 InvalidateFilter。我用这个函数更新代码。 m_listApp-&gt;setModel(m_proxyApp) 谢谢。我明白了这个问题。 错字:把m_lstApp-&gt;setModel(m_modelApp);改成m_lstApp-&gt;setModel(m_proxyApp); 【参考方案1】:

您的视图使用m_modelApp - 原始未过滤模型。您已经创建了m_proxyApp,但实际上并没有在任何地方使用它。

【讨论】:

我已将 Tableview 模型设置为 m_modelApp 并将 m_proxyApp 的源模型设置为 m_modelApp 我认为m_lstApp 是有问题的视图。你给了它m_modelApp作为模型-它对m_proxyApp一无所知 谢谢伊戈尔。我明白了这个问题。【参考方案2】:

您的表代理模型应按以下顺序初始化

m_modelApp = new QStandardItemModel();  // Original model
m_proxyApp = new ProxyModelApp();       // Custome proxy model
m_proxyApp->setSourceModel(m_modelApp); // Proxy to original model.
m_lstApp->setModel(m_proxyApp);         // Set the proxy model to the table view

【讨论】:

以上是关于QSortFilterProxyModel 不更新 QTableview的主要内容,如果未能解决你的问题,请参考以下文章

mvc(QSortFilterProxyModel)中的自定义排序仅适用一次

无法使用 QSortFilterProxyModel 按角色排序按 QDateTime 对模型进行排序

不能从 `QSortFilterProxyModel` 派生

QSortFilterProxyModel 仅对获取的数据进行排序

链式 QSortFilterProxyModel

QSortFilterProxyModel 打破 columnWidths