信号获取多个 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 的多个内容作为函数中的多个参数的主要内容,如果未能解决你的问题,请参考以下文章