我正在使用PyQt4
,但这很通用,只能应用于QT
。
我有一系列QComboBoxes
我从左到右填充(即选择最左边的项目将填充下一个项目。选择该项目中的项目将填充下一个项目,依此类推)< / p>
我无法在所有情况下触发信号(即无论当前索引是否发生变化,无论该项是由用户设置还是以编程方式设置)。
更多细节:
每当选择一个项目时,我依赖第一个QCombox
的信号来触发,这样我就可以填充gui中的下一个QCombobox
。然后我依靠THAT 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
项目的方式,每次都会触发信号?
答案 0 :(得分:8)
嗯......有时只是提问的行为可以引导你(部分)回答。
我有一个解决方法,但我仍然有兴趣听到有人有更好的想法。
我现在以加密方式立即以编程方式将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)
这个功能......有没有人有更好的主意?
非常感谢。
答案 1 :(得分:0)
您可以检查ComboBox的当前索引,然后调用您的广告位或调用setCurrentIndex()。
示例:
if comboBox1.currentIndex() == index:
self.load_comboBox2(index)
else
comboBox1.setCurrentIndex(index)
这样,您将不会结束两次调用插槽。