【问题标题】:Signal order with cascading QSortFilterProxyModel具有级联 QSortFilterProxyModel 的信号顺序
【发布时间】:2018-07-24 16:06:41
【问题描述】:

我有一个源模型,顶部有几个级联 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

【问题讨论】:

    标签: python-3.x qt pyqt pyqt5


    【解决方案1】:

    你的代码有错误,你监控的是sourceModel,而不是监控当前模型信号,它只会变成:

    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
    

    【讨论】:

    • @magu_ 最后一个先发现的对我来说似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2015-02-18
    相关资源
    最近更新 更多