2016-06-01 9:02 GMT+02:00 Elvis Stansvik <elvst...@gmail.com>: > 2016-06-01 8:54 GMT+02:00 Elvis Stansvik <elvst...@gmail.com>: >> Hi all, >> >> I've used QSortFilterProxyModel in the past, but it was quite a while >> ago and now I'm a little confused by the advice given in the docs. >> >> The description of the dynamicSortFilter property [1] reads: >> >> "Note that you should not update the source model through the proxy >> model when dynamicSortFilter is true. For instance, if you set the >> proxy model on a QComboBox, then using functions that update the >> model, e.g., addItem(), will not work as expected. An alternative is >> to set dynamicSortFilter to false and call sort() after adding items >> to the QComboBox. >> >> The default value is true." >> >> I can't remember this restriction from when I've worked with it >> before, and in the class description, underneath the second code >> snippet, it says: >> >> "Any changes made through the QSortFilterProxyModel are applied to the >> original model." >> >> As if it is safe to update the model through the QSFPM at this point, >> even if it is speaking of one where dynamicSortFilter is true (the >> default). >> >> Surely it must be possible to use a QSFPM with dynamicSortFilter set >> to true as the model of some view which also provides editing (and >> consequently will make its changes through the QSFPM)? Or is that >> simply not a supported use case? If I use dynamicSortFilter, must I >> always make my changes to the source model? > > As a simple concrete example, say I create a QStringListModel, wrap it > in a QSFPM (leaving dynamicSortFilter enabled) and set that QSFPM as > the model of a QListView with editing enabled. > > The docs make it sound like that's inadvisable (since the QListView > will perform its editing through the dynamically sorted QSFPM). Is > that right?
I made this basic test, which didn't show any ill effects when I made an edit through the QSFPM: from sys import argv, exit from PyQt5.QtCore import QCoreApplication, QTimer, Qt from PyQt5.QtCore import QSortFilterProxyModel, QStringListModel app = QCoreApplication(argv) def printRows(model): for row in range(model.rowCount()): print(model.data(model.index(row, 0), Qt.DisplayRole)) def test(): sourceModel = QStringListModel() sourceModel.setStringList(['B', 'A', 'C']) # QSFPM with dynamicSortFilter enabled proxyModel = QSortFilterProxyModel() proxyModel.setSourceModel(sourceModel) proxyModel.sort(0) print('sourceModel:') printRows(sourceModel) print('proxyModel before edit:') printRows(proxyModel) # Change the 'B' to an 'E' through the QSFPM proxyModel.setData(proxyModel.index(1, 0), 'E') print('proxyModel after edit:') printRows(proxyModel) app.quit() QTimer.singleShot(0, test) exit(app.exec_()) Result: [estan@pyret ~]$ python test.py sourceModel: B A C proxyModel before edit: A B C proxyModel after edit: A C E [estan@pyret ~]$ So either I'm misreading the docs, or my example is too simple. Any ideas? Elvis > > Elvis > >> >> Grateful for any advice, >> Elvis >> >> [1] http://doc.qt.io/qt-5/qsortfilterproxymodel.html#dynamicSortFilter-prop >> [2] http://doc.qt.io/qt-5/qsortfilterproxymodel.html#details _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest