我在 PyQT4 中有四个组合框。如果用户更改了第一个组合框中的值,则第二个组合框中的值会发生变化,类似地,如果第二个组合框中的值发生更改,则会导致第三个组合框的更改和第四个组合框的相同大小写。我想要的是当我更改第一个组合框的值时,它应该导致仅更改第二个组合框,而不影响第三个和第四个组合框中的更改。我怎么能在 PyQt 中做到这一点?
我在每个组合框上都有 changedIndex 事件设置。
答案 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
]