我有一个自定义模型(QAbstractListModel)和一个自定义代理模型(QSortFilterProxyModel)充当过滤器。在视图中,当我更新模型时,我需要执行"emit dataChanged(...)“来查看这些更改的显示。
但是,代理模型会自动更新(调用filterAcceptsRow),视图将应用相应的筛选选项。
我需要禁用此行为,以便能够更新视图,并且只在单击按钮时应用筛选,而不是自动。
例如:
selected (bool)
id (int)和视图,我只筛选那些被选中的元素(选中的== true)对于当前行为,此元素将消失,因为在模型更改时应用了筛选器。我想用此更改显示项目,并仅在单击按钮时应用筛选。
发布于 2020-04-09 20:35:33
您可以在自定义代理模型中实现公共方法,该方法用于启用/禁用筛选器。在我的示例代码中,我使用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,那么您将使自定义代理模型对QML上下文可见,例如将其设置为上下文属性(例如filterProxyModel),并通过调用启用筛选器。
filterProxyModel.enableFilter(true)发布于 2020-04-10 17:05:37
设置动态排序筛选器对我有效。默认情况下,在较早版本的QT中,这是错误的,但我意识到,对于当前版本,它是正确的!
https://stackoverflow.com/questions/61123100
复制相似问题