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)对您有帮助吗?