QSortFilterProxyModel не динамически обновляет фильтр?

У меня есть собственный подкласс QSortFilterProxyModel, Я переиграл filterAcceptsRow с пользовательским фильтром, который я хотел. Тогда я использовал это как так:

proxy = new MyFilterModel();
proxy->setSourceModel(...);
proxy->setDynamicSortFilter(true);
proxy->setFilterParams(...); // my custom function
comboBox->setModel(proxy);

Однако, когда базовая исходная модель обновлена ​​так, что ранее отфильтрованные строки больше не должны были фильтроваться, поле со списком не было обновлено этими строками. Это почему?

В конце концов я преодолел setSourceModel в MyFilterModel вот так:

void MyFilterModel::setSourceModel(QAbstractItemModel *sourceModel)
{
QSortFilterProxyModel::setSourceModel(sourceModel);

connect(sourceModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(doInvalidateFilter()));
connect(sourceModel, SIGNAL(modelReset()), this, SLOT(doInvalidateFilter()));

invalidateFilter();
}

… где все doInvalidateFilter() делает это вызов invalidateFilter, Это сработало — теперь, когда модель обновляется, сами строки фильтра также обновляются.

Я полагаю, что setDynamicSortFilter должен был уже позаботиться об этом, хотя. Это ошибка в Qt?

1

Решение

У меня была похожая проблема: прокси работает нормально.
Моя модель выглядит примерно так:

class MyModel:public QAbstractListModel{
...
bool setData(...) Q_DECL_OVERRIDE;
MyItem* get(int index);
private:
QList<MyItem*> m_model;
}

Я думал, что меняю MyItem (в QML) через модель (косвенно, вызывая «setData (…)»), но после того, как я натолкнулся на ваш пост, я еще раз проверил файл QML, и оказалось, что Я менял не модель, а сам предмет.

И модель не знает об изменениях, поэтому прокси и мнение.

Я обновил MyItem для передачи сигналов родительской модели, если она изменилась, чтобы модель могла передавать DataChanged (…) и уведомлять других.

Может быть, у вас есть что-то похожее в вашем коде?

0

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


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