Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更新sourceModel(),而不对QSortFilterProxyModel应用筛选_C++_Qt_Qml - Fatal编程技术网

C++ 更新sourceModel(),而不对QSortFilterProxyModel应用筛选

C++ 更新sourceModel(),而不对QSortFilterProxyModel应用筛选,c++,qt,qml,C++,Qt,Qml,我有一个自定义模型(QAbstractListModel)和一个自定义代理模型(QSortFilterProxyModel)用作过滤器。 在视图中,当我更新模型时,我需要执行“emit dataChanged(…)”以查看显示的更改 但是,代理模型会自动更新(filterAcceptsRow被调用),视图会应用相应的过滤选项 我需要禁用此行为,以便能够更新视图并仅在单击按钮时应用过滤,而不是自动应用过滤 例如: 我的模型有两个字段,id(int)和selected(bool) 在视图中,我只过

我有一个自定义模型(
QAbstractListModel
)和一个自定义代理模型(
QSortFilterProxyModel
)用作过滤器。 在视图中,当我更新模型时,我需要执行“
emit dataChanged(…)
”以查看显示的更改

但是,代理模型会自动更新(
filterAcceptsRow
被调用),视图会应用相应的过滤选项

我需要禁用此行为,以便能够更新视图并仅在单击按钮时应用过滤,而不是自动应用过滤

例如:

  • 我的模型有两个字段,
    id(int)
    selected(bool)
  • 在视图中,我只过滤那些选中的元素(selected==true)
  • 应用此过滤器后,我取消选择一个元素

对于当前行为,此元素将消失,因为模型更改时将应用过滤器。我想显示带有此更改的项目,并仅在单击按钮时应用筛选。

您可以在自定义代理模型中实现一个公共方法,用于启用/禁用筛选。在我的示例代码中,我使用Q_INVOKABLE宏使
enableFilter()
也可以从QML调用。因此,您可以通过调用方法在单击按钮时启用过滤器

class ExampleFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
public:
    explicit ExampleFilterProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {}

    Q_INVOKABLE void setFilter(const QString & pattern) {
        QRegularExpression re(pattern, QRegularExpression::CaseInsensitiveOption);
        if (re.isValid()) {
            QSortFilterProxyModel::setFilterRegularExpression(pattern);
        }
        invalidateFilter();
    }

    Q_INVOKABLE void enableFilter(bool enabled) {
        m_enabled = enabled;
        invalidateFilter();
    }

protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override {
    if (m_enabled) {
        QModelIndex index = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent);
        QString str = sourceModel()->data(index, filterRole()).toString();
        return str.contains(filterRegularExpression());
    }
    return true;
}

private:
    bool m_enabled = false;
};
在实例化模型时,如果没有显式地使用true调用enableFilter,则
filterAcceptsRow()
方法将为所有行返回true

myFilterProxyModel->setFilterRole(MyListModel::ExampleRole);
myFilterProxyModel->setFilter("^fullstringmatch$");
myFilterProxyModel->setSourceModel(myModel);
//myFilterProxyModel->enableFilter(true);
如果您使用的是QML,则可以通过将自定义代理模型设置为上下文属性(例如filterProxyModel)使其对QML上下文可见,并通过调用

filterProxyModel.enableFilter(true)

设置动态排序筛选器对我很有用。在QT的旧版本中,默认情况下这是错误的,但我意识到在当前版本中这是正确的

setDynamicSortFilter(false)对您有帮助吗?