PyQt(或只是QT)。如何将QComboBox设置为某个值时触发信号(即使没有更改)

时间:2010-10-19 03:16:59

标签: qt pyqt signals qcombobox

我正在使用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项目的方式,每次都会触发信号?

2 个答案:

答案 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)

这样,您将不会结束两次调用插槽。