我正在使用 PyQt4
,但这足够通用,可以仅适用于 QT
。
我有一系列从左到右填充的 QComboBoxes(即选择最左边的一个项目将填充下一个项目。选择该项目中的一个项目将填充下一个项目,等等上)
我很难在所有情况下触发信号(即,无论当前索引是否更改,也无论该项目是由用户设置还是以编程方式设置)。
更多细节:
每当选择一个项目时,我都会依靠第一个 QCombobox
的信号来触发,以便我可以填充 GUI 中的下一个 QCombobox
。然后,我依靠 QCombobox
发出信号,以便我可以填充下一个信号。等等。
我想根据用户上次与 gui 的交互在每个 QCombobox 中预先选择一个项目。
每个 QCombobox
有一个独特的函数,负责填充和预选择该 QCombobox
。代码看起来像这样:
comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)
其中 intLastSavedState1
是一个整数,派生自用户上次使用应用程序时最后选择的文本。我希望这个函数的最后一行会触发一个信号,导致下一个组合框的函数加载并预选一个项目 (comboBox2
)。然后,该操作将导致下一个组合框的功能激活,并且它会级联到下一个和下一个。但它并不适用于所有情况。
我尝试了两个版本的信号:
self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)
和
self.connect(comboBox1, QtCore.SIGNAL("activated(const QString&)"), self.load_comboBox2)
在第一种情况下,仅当 intLastSavedState1
与组合框中当前选择的内容不同时,信号才会触发。如果用户最后从该列表中选择了项目 0,这会导致问题。在这种情况下,QT
无法识别我的脚本,将当前索引设置为 0 作为更改(因为加载框后,它似乎认为它已经在索引 0 上),因此信号确实不火。
在第二种情况下,无论当前在组合框中选择什么,信号都会触发......但前提是由用户激活。当我的脚本尝试以编程方式设置当前索引时,它不会触发。
这似乎是我关于信号的唯一两个选择。那么...是否有另一种方法可以在 QCombobox
中预先选择项目,每次都会触发一个信号?
最佳答案
嗯...有时只是提出问题的行为就可以让您得到(部分)答案。
我有一个解决方法,但我仍然有兴趣听听是否有人有更好的想法。
我现在在加载后立即以编程方式将 QCombobox
的索引设置为 -1
。然后,当我根据用户的历史记录以编程方式设置实际索引时,它将始终被视为更改(即它永远不会是 -1)并且信号将触发
使用:currentIndexChanged(const QString&)
所以我的代码现在看起来像这样:
comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.setCurrentIndex(-1)
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)
我的信号如下所示:
self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2)
这个功能...有人有更好的主意吗?
谢谢阿吉安。
关于qt - PyQt(或简称 QT)。如何让 QComboBox 在设置值(即使未更改)时触发信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3965093/