QSortFilterProxyModel нет ретрансляции сигнала dataChanged

У меня есть пользовательская модель, которая время от времени добавляет сигнал dataChanged () при изменении значений некоторых ячеек.
Это прекрасно работает само по себе, и представление обновляется по мере необходимости.

Но затем я попытался вставить QSortFilterProxyModel в середине, чтобы разрешить сортировку (фильтрация не требуется) в моем представлении, и, очевидно, сигнал dataChanged () не передается через модель прокси.

Насколько я могу судить, это ожидаемое поведение для QSortFilterProxyModel. Есть ли какое-либо решение, кроме подкласса QSortFilterProxyModel, просто добавить слот для ретрансляции сигнала dataChanged () и отображения элементов соответственно?

В моем случае это довольно просто, поскольку за один раз обновляется только одна ячейка или целый столбец, но ничего более интересного, поэтому отображение индексов должно быть довольно простым …

2

Решение

QSortFilterProxyModel должен испускать dataChanged () сигнал, как нормальная модель будет делать, поэтому представление будет обновляться. В исходном коде Qt (qsortfilterproxymodel.cpp) мы видим, что QSortFilterProxyModel :: setSourceModel присоединяет обработчик к dataChanged () сигнал исходной модели. Обработчик делает свою работу и выдает QSortFilterProxyModel’s dataChanged () сигнал, если все прошло хорошо. Обратите внимание, что он имеет ряд проверок, которые могут помешать излучению сигнала.

Если этого не происходит, убедитесь, что ваша пользовательская модель реализована правильно, в противном случае логика QSortFilterProxyModel может подавить сигнал. Например, когда у меня была такая же проблема, оказалось, что моя реализация QAbstractItemModel :: родитель метод был неверным.

В худшем случае вы можете попытаться скомпилировать Qt самостоятельно и выполнить некоторую отладку, чтобы найти причину.

3

Другие решения

Вы можете вызвать сигнал из QSortFilterProxyModel, не наследуя его
QMetoObject :: InvokeMethod
Не забудьте проверить вспомогательные функции:
mapFromSource
mapToSource

0

По вопросам рекламы [email protected]