8

我正在使用PyQt4,但这足够通用,它可以仅适用于QT.

我有一系列QComboBoxes我从左到右填充的(即选择最左边的一个项目将填充下一个。选择其中一个项目将填充下一个,依此类推)

我很难让我的信号在所有情况下都触发(即无论当前索引是否更改以及无论该项目是由用户设置还是以编程方式设置)。

更多详情:

I rely on the signals of the first QComboxto fire whenever an item is selected so that I can populate the next QComboboxin the gui. 然后我依靠那个QCombobox来发出一个信号,以便我可以填充下一个。等等。

QCombobox我想根据用户与 gui 的最后一次交互在每个项目中预先选择一个项目。

我有一个独特的功能 perQCombobox负责填充和预选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每次都会触发一个信号?

4

2 回答 2

10

嗯......有时只是提出问题的行为就可以让你得到一个(部分)答案。

我有一个解决方法,但我仍然有兴趣听听是否有人有更好的主意。

我现在在加载后立即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)

这个功能......有人有更好的主意吗?

谢谢阿甘。

于 2010-10-19T03:29:52.493 回答
0

您可以检查 ComboBox 的当前索引,然后调用您的插槽或调用 setCurrentIndex()。

例子:

if comboBox1.currentIndex() == index:
    self.load_comboBox2(index)
else
    comboBox1.setCurrentIndex(index)

这样你就不会最终调用 slot 两次。

于 2020-07-12T11:42:30.690 回答