我使用的是PyQt4
,但这足够通用,它只适用于QT
。
我有一系列从左到右填充的QComboBoxes
(即选择最左边的一项将填充下一项。选择其中的一个项目将填充下一个项目,依此类推)
我很难让我的信号在所有情况下触发(即,无论当前索引是否改变,也不管项目是由用户设置还是通过编程设置)。
更多详细信息:
每当选择一个项目时,我都依赖于要触发的第一个QCombox
的信号,以便我可以填充gui中的下一个QCombobox
。然后,我依靠该QCombobox
发出一个信号,以便填充下一个。诸若此类。
我想根据用户最后一次与gui的交互在每个QCombobox
中预先选择一个项目。
我对每个QCombobox
都有一个独特的函数,它负责填充和预先选择该QCombobox
。代码看起来像这样:
comboBox1.blockSignals(True)
comboBox1.clear()
comboBox1.addItems(sorted(itemList))
comboBox1.blockSignals(False)
comboBox1.setCurrentIndex(intLastSavedState1)
其中,intLastSavedState1
是从用户上次使用应用程序时最后选择的文本派生而来的整数。我曾希望此函数的最后一行将触发一个信号,该信号将导致下一个组合框的函数加载并预先选择一个项目(comboBox2
)。然后,该操作将导致下一个comboBox's
函数被激活,并且它将级联到下一个和下一个。但它并不是在所有情况下都有效。
我尝试了两个版本的信号:
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
中的项目,这样每次都会触发一个信号?
发布于 2010-10-19 03:29:52
好吧..。有时,仅仅是问一个问题的行为就可以让你得到一个(部分)答案。
我有一个变通的办法,但我仍然有兴趣听到如果有人有更好的想法。
我现在通过编程将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)
这个函数...有谁有更好的主意吗?
再次感谢你。
发布于 2020-07-12 11:42:31
您可以检查ComboBox的当前索引,然后调用您的插槽或调用setCurrentIndex()。
示例:
if comboBox1.currentIndex() == index:
self.load_comboBox2(index)
else
comboBox1.setCurrentIndex(index)
这样你就不会调用slot两次了。
https://stackoverflow.com/questions/3965093
复制相似问题