У меня есть собственный подкласс 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?
У меня была похожая проблема: прокси работает нормально.
Моя модель выглядит примерно так:
class MyModel:public QAbstractListModel{
...
bool setData(...) Q_DECL_OVERRIDE;
MyItem* get(int index);
private:
QList<MyItem*> m_model;
}
Я думал, что меняю MyItem (в QML) через модель (косвенно, вызывая «setData (…)»), но после того, как я натолкнулся на ваш пост, я еще раз проверил файл QML, и оказалось, что Я менял не модель, а сам предмет.
И модель не знает об изменениях, поэтому прокси и мнение.
Я обновил MyItem для передачи сигналов родительской модели, если она изменилась, чтобы модель могла передавать DataChanged (…) и уведомлять других.
Может быть, у вас есть что-то похожее в вашем коде?