问题 使用列表作为参数定义pyqt4信号


根据

http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html

我可以用一个整数参数来定义一个pyqt4信号 mysignal = pyqtSignal(int)。如何定义一个信号,该信号采用整数和字符串列表,或更一般地说是一个被调用的对象 myobject 作为论点。


6210
2017-12-23 11:52


起源



答案:


以下代码创建一个带有两个参数的信号:整数和对象列表。 UI只包含一个按钮。单击按钮时会发出信号。

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Foo(object):
    pass

class MyWidget(QWidget):
    mysignal = pyqtSignal(int, list)

    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.hlayout = QHBoxLayout()
        self.setLayout(self.hlayout)
        self.b = QPushButton("Emit your signal!", self)
        self.hlayout.addWidget(self.b)
        self.b.clicked.connect(self.clickHandler)
        self.mysignal.connect(self.mySignalHandler)

    def clickHandler(self):
        self.mysignal.emit(5, ["a", Foo(), 6])

    def mySignalHandler(self, n, l):
        print n
        print l

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

单击按钮时,您应该看到如下内容:

5
['a', <__main__.Foo object at 0xb7423e0c>, 6]

在你的终端上。


15
2017-12-23 12:35



哦,我的好例子! :) - kuanyui
布拉沃。这有希望在connect()中使'lambda'死亡吗? - Johnny Utahh
你还没用过 pyqtSlot 装饰。插入后我有seg故障消失了,所以我建议添加它 mySignalHandler。 - Michael Scheper
此外,如果您不使用通配符导入,您的答案会更清楚。 - Michael Scheper


答案:


以下代码创建一个带有两个参数的信号:整数和对象列表。 UI只包含一个按钮。单击按钮时会发出信号。

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Foo(object):
    pass

class MyWidget(QWidget):
    mysignal = pyqtSignal(int, list)

    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.hlayout = QHBoxLayout()
        self.setLayout(self.hlayout)
        self.b = QPushButton("Emit your signal!", self)
        self.hlayout.addWidget(self.b)
        self.b.clicked.connect(self.clickHandler)
        self.mysignal.connect(self.mySignalHandler)

    def clickHandler(self):
        self.mysignal.emit(5, ["a", Foo(), 6])

    def mySignalHandler(self, n, l):
        print n
        print l

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

单击按钮时,您应该看到如下内容:

5
['a', <__main__.Foo object at 0xb7423e0c>, 6]

在你的终端上。


15
2017-12-23 12:35



哦,我的好例子! :) - kuanyui
布拉沃。这有希望在connect()中使'lambda'死亡吗? - Johnny Utahh
你还没用过 pyqtSlot 装饰。插入后我有seg故障消失了,所以我建议添加它 mySignalHandler。 - Michael Scheper
此外,如果您不使用通配符导入,您的答案会更清楚。 - Michael Scheper