QSortFilterProxyModel: fix binding loops

... by using valueBypassingBindings() when accessing the properties
from the setters.

Task-number: QTBUG-116346
Change-Id: Ibbad552fa1e611f4bb704b4e47667df5f328f152
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
(cherry picked from commit 2ef65f895be6cf7b448e739301a19a3c82458f7b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ivan Solovev 2023-08-25 16:13:15 +02:00 committed by Qt Cherry-pick Bot
parent 94d9e05aa6
commit 5381df0240

View File

@ -256,7 +256,7 @@ public:
*/ */
void set_filter_pattern(const QString &pattern) void set_filter_pattern(const QString &pattern)
{ {
QRegularExpression re = filter_regularexpression.value(); QRegularExpression re = filter_regularexpression.valueBypassingBindings();
const auto cs = re.patternOptions() & QRegularExpression::CaseInsensitiveOption; const auto cs = re.patternOptions() & QRegularExpression::CaseInsensitiveOption;
re.setPattern(pattern); re.setPattern(pattern);
re.setPatternOptions(cs); re.setPatternOptions(cs);
@ -1267,7 +1267,7 @@ void QSortFilterProxyModelPrivate::update_persistent_indexes(
*/ */
void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex &source_parent) void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex &source_parent)
{ {
if (!filter_regularexpression.value().pattern().isEmpty() if (!filter_regularexpression.valueBypassingBindings().pattern().isEmpty()
&& source_index_mapping.constFind(source_parent) == source_index_mapping.constEnd()) { && source_index_mapping.constFind(source_parent) == source_index_mapping.constEnd()) {
create_mapping(source_parent); create_mapping(source_parent);
} }
@ -2583,10 +2583,11 @@ void QSortFilterProxyModel::setFilterRegularExpression(const QRegularExpression
{ {
Q_D(QSortFilterProxyModel); Q_D(QSortFilterProxyModel);
const QScopedPropertyUpdateGroup guard; const QScopedPropertyUpdateGroup guard;
const bool regExpChanged = regularExpression != d->filter_regularexpression.value(); const bool regExpChanged =
regularExpression != d->filter_regularexpression.valueBypassingBindings();
d->filter_regularexpression.removeBindingUnlessInWrapper(); d->filter_regularexpression.removeBindingUnlessInWrapper();
d->filter_casesensitive.removeBindingUnlessInWrapper(); d->filter_casesensitive.removeBindingUnlessInWrapper();
const Qt::CaseSensitivity cs = filterCaseSensitivity(); const Qt::CaseSensitivity cs = d->filter_casesensitive.valueBypassingBindings();
d->filter_about_to_be_changed(); d->filter_about_to_be_changed();
const Qt::CaseSensitivity updatedCs = const Qt::CaseSensitivity updatedCs =
regularExpression.patternOptions() & QRegularExpression::CaseInsensitiveOption regularExpression.patternOptions() & QRegularExpression::CaseInsensitiveOption
@ -2627,7 +2628,7 @@ void QSortFilterProxyModel::setFilterKeyColumn(int column)
Q_D(QSortFilterProxyModel); Q_D(QSortFilterProxyModel);
d->filter_column.removeBindingUnlessInWrapper(); d->filter_column.removeBindingUnlessInWrapper();
d->filter_about_to_be_changed(); d->filter_about_to_be_changed();
const auto oldColumn = d->filter_column.value(); const auto oldColumn = d->filter_column.valueBypassingBindings();
d->filter_column.setValueBypassingBindings(column); d->filter_column.setValueBypassingBindings(column);
d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows);
if (oldColumn != column) if (oldColumn != column)
@ -2925,7 +2926,7 @@ void QSortFilterProxyModel::setSortRole(int role)
{ {
Q_D(QSortFilterProxyModel); Q_D(QSortFilterProxyModel);
d->sort_role.removeBindingUnlessInWrapper(); d->sort_role.removeBindingUnlessInWrapper();
if (d->sort_role == role) if (d->sort_role.valueBypassingBindings() == role)
return; return;
d->sort_role.setValueBypassingBindings(role); d->sort_role.setValueBypassingBindings(role);
d->sort(); d->sort();
@ -2964,7 +2965,7 @@ void QSortFilterProxyModel::setFilterRole(int role)
{ {
Q_D(QSortFilterProxyModel); Q_D(QSortFilterProxyModel);
d->filter_role.removeBindingUnlessInWrapper(); d->filter_role.removeBindingUnlessInWrapper();
if (d->filter_role == role) if (d->filter_role.valueBypassingBindings() == role)
return; return;
d->filter_about_to_be_changed(); d->filter_about_to_be_changed();
d->filter_role.setValueBypassingBindings(role); d->filter_role.setValueBypassingBindings(role);