Pyqt防止组合变化值

时间:2017-09-22 11:24:25

标签: python pyqt pyqt4 qcombobox

我在 PyQT4 中有四个组合框。如果用户更改了第一个组合框中的值,则第二个组合框中的值会发生变化,类似地,如果第二个组合框中的值发生更改,则会导致第三个组合框的更改和第四个组合框的相同大小写。我想要的是当我更改第一个组合框的值时,它应该导致仅更改第二个组合框,而不影响第三个和第四个组合框中的更改。我怎么能在 PyQt 中做到这一点?

我在每个组合框上都有 changedIndex 事件设置。

2 个答案:

答案 0 :(得分:4)

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

  

bool QObject.blockSignals(self,bool b)

     

如果block为true,则此对象发出的信号被阻塞(即   发出信号不会调用连接到它的任何东西)。如果阻止   是错误的,不会发生这样的阻塞。

     

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

     

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

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

class ComboBox(QComboBox):
    def setCurrentIndex(self, ix):
        self.blockSignals(True)
        QComboBox.setCurrentIndex(self, ix)
        self.blockSignals(False)

以下示例显示了它的用法:

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_())

答案 1 :(得分:0)

我无法为您提供确切的代码,但从概念上讲,您可以在全局级别设置一些标志,当您不希望事件触发时,您可以直接返回函数调用而不在第一行

可能是这样的

"multi_match" => [
                "fields" => ["prod_name", "prod_seo_name"],
                "type" => "phrase_prefix",
                "query" => $query
            ]