在PyQt中,如何使用信号和槽将下拉列表连接到函数?

3
在PyQt中,有一个信号和槽的概念,用于连接对象到彼此的函数,但我似乎找不到与其他对象没有关联的函数的引用。例如,我想让下拉列表运行算法A或算法B。
PyQt如何实现这个功能呢?

我不是很确定你在询问什么,是否可以使用常规的Python函数作为信号回调? - Torsten Marek
也许信号和槽并不是我要找的?我想将一个函数连接到下拉列表。 - Mark
1个回答

3

你想要改变下拉列表以调用函数的效果吗?

将下拉列表的适当信号连接到你的函数。

例如,使用 QComboBox 的 currentIndexChanged() 信号。将其连接到一个“包装器”函数,该函数根据索引决定调用哪个函数。

编辑:包装器可以非常简单,像这样:

functions = {0: reference_to_function_1, 1: reference_to_function_2}

def wrapper(index):
    functions[index]()

编辑2:如果您想要一些连接插槽的替代方法:

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#connecting-signals-and-slots

注意区分Py或Qt信号和Python函数或方法。例如,下面是将Qt信号连接到Python函数和Python方法的语法:
QtCore.QObject.connect(a, QtCore.SIGNAL("QtSig()"), pyFunction) #function-style
QtCore.QObject.connect(a, QtCore.SIGNAL("QtSig()"), pyClass.pyMethod) #method-style

没错。这就是我想问的。但是为什么我需要一个包装函数?这对我来说很奇怪。 - Mark
因为信号受它们发送的参数限制。您需要根据参数更改调用的函数(即,单击下拉列表中的哪个元素)。由于 QComboBox 不存储函数引用(它存储带有整数索引的 QStrings),因此无法将函数引用作为参数发送。 - user44484
没错。只是举个例子。或许应该使用组合框来询问参数是如何传递的,哈哈。 - Mark
个人使用的格式是:QtCore.QObject.connect(a, QtCore.SIGNAL("function1(type)"), b, QtCore.SLOT("function2(type)")),尽管显然在新版本的PyQt中有更好的方式。 - user44484
在“一般情况下”,方法/函数的签名必须相同。currentIndexChanged(int) 指明将会传递一个 int 类型的参数。因此,您必须提供一个与该签名兼容的方法/函数,例如 def function2(index)。Qt 会处理参数传递。不过,这里有很多例外情况,我建议您尝试一下。我认为甚至可以向不接受参数的函数发送带有参数的信号,或者向接受可变数量参数的函数发送信号。 - user44484
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接