信号获取多个 Qcombox 的多个内容作为函数中的多个参数

Posted

技术标签:

【中文标题】信号获取多个 Qcombox 的多个内容作为函数中的多个参数【英文标题】:Signal getting multiple contents of several Qcomboxs as multiple parameters in function 【发布时间】:2019-12-14 10:41:35 【问题描述】:

我有 3 个具有不同内容的 QCombobox 想要获取所有 3 个 Qcombobox 的当前索引并将它们作为多个参数发送到一个函数。我不知道PyQt5 有可能吗?

    # Creating multiple comboxs
    self.combo_1 = QtWidgets.QComboBox()
    self.combo_1.addItems(['a', 'b', 'c', 'd', 'e'])
    self.combo_2 = QtWidgets.QComboBox()
    self.combo_2.addItems([1, 2, 3, 4, 5])
    self.combo_3 = QtWidgets.QComboBox()
    self.combo_3.addItems(['I', 'II', 'III', 'IV', 'V'])

    ----------------------------------
    # Creating singal and slots
    self.combo_1.activated[int].connect(self.getindex)
    self.combo_2.activated[int].connect(self.getindex)
    self.combo_3.activated[int].connect(self.getindex)
    self.combo_1.activated.emit(self.combo_1.currentIndex())
    self.combo_2.activated.emit(self.combo_2.currentIndex())
    self.combo_3.activated.emit(self.combo_3.currentIndex())

    ----------------------------------
    # forward it to function
    @QtCore.pyqtSlot(int)
    def getindex(self, index1, index2, index3 ):
        print(' index from combo_1'.format(index1))
        print(' index from combo_2'.format(index2))
        print(' index from combo_3'.format(index3))

我怎样才能实现这种行为?谢谢

【问题讨论】:

【参考方案1】:

QComboBox 是该类的成员,因此您可以使用 currentIndex() 方法获取索引:

    self.combo_1.activated.connect(self.getindex)
    self.combo_2.activated.connect(self.getindex)
    self.combo_3.activated.connect(self.getindex)
    self.getIndex()

@QtCore.pyqtSlot()
def getindex(self):
    index1 = self.combo_1.currentIndex()
    index2 = self.combo_2.currentIndex()
    index3 = self.combo_2.currentIndex()
    print(' index from combo_1'.format(index1))
    print(' index from combo_2'.format(index2))
    print(' index from combo_3'.format(index3))

【讨论】:

提供的解决方案工作正常,但它在启动时工作,因为 self.combo_1.activated..emit() 导致 int 错误? @Pavel.D 1) 我在该行中没有收到错误,但如果我在 self.combo_2.addItems([1, 2, 3, 4, 5]) 中收到错误,因为 QComboBox 不接受数字列表而是字符串,它会更改为 self.combo_2.addItems(["1", "2", "3", "4", "5"]) 2) 你有没有向emit() 传递任何数字?如果您通过但在您的评论中没有,请在您的问题代码中 不,我没有将任何数字传递给 emit()。我通过制作自定义信号和插槽来解决这个启动问题:startup = QtCore.pyqtSignal(),并添加 2 行:self.startup.connect(self.getindex)self.startup.emit()。它强制在启动时运行函数,这样不需要从整数到字符串的任何转换。 @Pavel.D 那是错误,在激活的情况下你需要一个整数,但是如果你想让getindex函数在开始时运行,那么直接调用它。看我的更新。无需创建新信号 你确实是对的,不需要自定义信号和槽。只需调用该函数。【参考方案2】:

您确定要使用activated 而不是currentIndexChanged? 如果您只想激活一项功能,那么 eyllanesc 的解决方案非常棒。但是,如果您想在 Widget 类之外使用它,我建议创建自定义信号和方法来计算它的值。

这是我将以通用方式解决它的方法。

from typing import List
from PyQt5.QtWidgets import QWidget, QComboBox, QHBoxLayout, QApplication
from PyQt5.QtCore import pyqtSignal, pyqtSlot


class ComboBoxGroup(QWidget):
    indexes_changed = pyqtSignal(list)

    def __init__(self, initial_values: List[List[str]]):
        super().__init__()
        layout = QHBoxLayout()
        self.combos = []
        for values in initial_values:
            combo_box = QComboBox()
            combo_box.addItems(values)
            combo_box.currentIndexChanged.connect(self.value_changed)
            layout.addWidget(combo_box)
            self.combos.append(combo_box)
        self.setLayout(layout)


    def value_changed(self):
        res = [x.currentIndex() for x in self.combos]
        self.indexes_changed.emit(res)


def test(values: List[int]):
    print("current indexes: " + ",".join(map(str, values)))

if __name__ == "__main__":
    app = QApplication([])
    group = ComboBoxGroup([['a', 'b', 'c', 'd', 'e'], ['1', '2', '3', '4', '5'], ['I', 'II', 'III', 'IV', 'V']])
    group.indexes_changed.connect(test)
    group.show()
    app.exec_()

【讨论】:

太棒了!您的替代解决方案非常有趣。毫无疑问,这可以使用!谢谢你。

以上是关于信号获取多个 Qcombox 的多个内容作为函数中的多个参数的主要内容,如果未能解决你的问题,请参考以下文章

JS fetch API:如何使用一个异步函数从多个文件中获取内容?

PyQt 和 QML:如何在一个插槽或函数中处理多个信号

多个线程上的信号量和临界区问题

Qt emit同时发送信号给多个槽函数?

快速开发QCombox以及业务样式自定义

具有相同参考光标的多个循环