首页 文章

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

提问于
浏览
7

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

1 回答

  • 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)
    

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

    谢谢agian .

相关问题