Pyqt 防止组合框更改值

Ahs*_*tar 4 python pyqt pyqt4 qcombobox

我在PyQT4中有四个组合框。如果用户更改第一个组合框中的值,则第二个组合框中的值也会更改,同样,如果第二个组合框中的值发生更改,则会导致第三个组合框的更改以及第四个组合框的情况相同。我想要的是当我更改第一个组合框的值时,它应该只导致第二个组合框的更改,而不会影响第三个和第四个组合框的更改。我怎样才能在PyQt 中做到这一点?

我已经更改了每个组合框上的索引事件设置。

eyl*_*esc 7

要防止对象在给定上下文中发出信号,您必须使用blockSignals()

bool QObject.blockSignals (self, bool b)

如果 block 为真,则此对象发出的信号将被阻塞(即,发出信号不会调用与其连接的任何东西)。如果 block 为 false,则不会发生此类阻塞。

返回值是signalsBlocked() 的前一个值。

请注意,即使此对象的信号已被阻止,也会发出 destroy() 信号。

为了简化任务,该setCurrentIndex()方法将被覆盖。

class ComboBox(QComboBox):
    def setCurrentIndex(self, ix):
        self.blockSignals(True)
        QComboBox.setCurrentIndex(self, ix)
        self.blockSignals(False)
Run Code Online (Sandbox Code Playgroud)

下面的例子展示了它的用法:

class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setLayout(QVBoxLayout())

        l = [str(i) for i in range(5)]
        cb1 = ComboBox(self)
        cb1.addItems(l)

        cb2 = ComboBox(self)
        cb2.addItems(l)

        cb3 = ComboBox(self)
        cb3.addItems(l)

        cb4 = ComboBox(self)
        cb4.addItems(l)

        cb1.currentIndexChanged.connect(cb2.setCurrentIndex)
        cb2.currentIndexChanged.connect(cb3.setCurrentIndex)
        cb3.currentIndexChanged.connect(cb4.setCurrentIndex)

        self.layout().addWidget(cb1)
        self.layout().addWidget(cb2)
        self.layout().addWidget(cb3)
        self.layout().addWidget(cb4)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)