代码之家  ›  专栏  ›  技术社区  ›  magu_

级联qsortfilterproxymodel的信号顺序

  •  0
  • magu_  · 技术社区  · 7 年前

    我有一个具有多个级联的源模型 QSortFilterProxyModel 在上面。对于我的申请,我需要 modelReset 从下到上冒泡的信号,而不是相反,我该怎么做?

    MWE:

    from PyQt5 import QtWidgets, QtCore
    import sys
    
    
    class Model(QtCore.QAbstractTableModel):
        def reset(self):
            self.beginResetModel()
            self.endResetModel()
    
    
    class Filter(QtCore.QSortFilterProxyModel):
        def __init__(self, model, arg):
            super().__init__(model)
            self.setSourceModel(model)
            model.modelReset.connect(lambda: print(f'Reset {arg}'))
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
    
        model = Model()
        filter0 = Filter(model, '0')
        filter1 = Filter(filter0, '1')
        filter2 = Filter(filter1, '2')
        filter3 = Filter(filter2, '3')
    
        button = QtWidgets.QPushButton('Reset')
        button.clicked.connect(model.reset)
        button.show()
    
        sys.exit(app.exec_())
    

    返回:

    Reset 3
    Reset 2
    Reset 1
    Reset 0
    

    但是我想要

    Reset 0
    Reset 1
    Reset 2
    Reset 3
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    7 年前

    您的代码有一个错误,它没有监视您监视的源模型的当前模型信号,而是只更改为:

    import sys
    from PyQt5 import QtWidgets, QtCore
    
    
    class Model(QtCore.QAbstractTableModel):
        def reset(self):
            self.beginResetModel()
            self.endResetModel()
    
    
    class Filter(QtCore.QSortFilterProxyModel):
        def __init__(self, model, arg, parent=None):
            super().__init__(parent)
            self.setSourceModel(model)
            self.modelReset.connect(lambda: print(f'Reset {arg}')) # <---
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
    
        model = Model()
        filter0 = Filter(model, '0')
        filter1 = Filter(filter0, '1')
        filter2 = Filter(filter1, '2')
        filter3 = Filter(filter2, '3')
    
        button = QtWidgets.QPushButton('Reset')
        button.clicked.connect(model.reset)
        button.show()
    
        sys.exit(app.exec_())
    

    输出:

    Reset 0
    Reset 1
    Reset 2
    Reset 3