2013-12-04 8 views
1

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

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

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

В моем случае это довольно прямо вперед, как только одна клетка обновляется, в то время, или целый столбец, но больше ничего фанки, поэтому отображающие индексы должны быть довольно просто ...

+0

Вы пытались использовать 'setDynamicSortFilter (true)'? –

ответ

0

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

2

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

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

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

Смежные вопросы