美文网首页
PyQt5编程(13):信号的产生

PyQt5编程(13):信号的产生

作者: 用电热毯烤猪 | 来源:发表于2018-01-01 21:32 被阅读0次

某些情况下,需要通过编程产生信号。例如,填表完成按下回车键时,需要模拟按下”OK“按钮。实现该功能的函数为QObject类的emit()。
格式为:
emit(*args)
args--传递到任何连接槽的的可选序列传参数;

模拟按钮动作的代码:
button.clicked.emit()

在调用emit()时,信号和槽可以传递参数。例如:
button.clicked[bool].emit(False)
button.clicked["bool"].emit(False)

PyQt5已经自动定义了很多QT内建的信号。但是在实际的使用中为了灵活使用信号与槽机制,我们可以根据需要自定义signal。可以使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。pyqtSignal()方法原型:
PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]])

函数参数:
types – the types that define the C++ signature of the signal. Each type may be a Python typeobject or a string that is the name of a C++ type. Alternatively each may be a sequence of type arguments. In this case each sequence defines the signature of a different signal overload.The first overload will be the default.

name – the name of the signal. If it is omitted then the name of the class attribute is used. This may only be given as a keyword argument.

revision – the revision of the signal that is exported to QML. This may only be given as a keyword argument.

arguments – the sequence of the names of the signal’s arguments that is exported to QML. This may only be given as a keyword argument.

Return type: an unbound signal

一个信号可以有多个重载的版本。

通过情况下,默认的信号名与类的属性相同。但也可通过name参数生成一个特定的名称:
mysignal = QtCore.pyqtSignal(int, name = 'mySignal')

下面的例子将创建两个按钮。第一个按钮按下时产生两个信号:
1.模拟按钮2被按下
2.产生一个屏幕位置的信号

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtWidgets

class MyWindow(QtWidgets.QWidget):
    mysignal = QtCore.pyqtSignal(int, int)

    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowTitle("编程产生信号")
        self.resize(300, 100)
        self.button1 = QtWidgets.QPushButton("点击按钮1")
        self.button2 = QtWidgets.QPushButton("按钮 2")
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(self.button1)
        vbox.addWidget(self.button2)
        self.setLayout(vbox)
        self.button1.clicked.connect(self.on_clicked_button1)
        self.button2.clicked.connect(self.on_clicked_button2)
        self.mysignal.connect(self.on_mysignal)

    def on_clicked_button1(self):
        print("按下按钮1")
        # 触发信号
        self.button2.clicked[bool].emit(False)
        self.mysignal.emit(10, 20)

    def on_clicked_button2(self):
        print("按下按钮2")

    def on_mysignal(self, x, y):
        print("处理自定义信号mysignal()")
        print("x =", x, "y =", y)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

除了指定接收特定类型的信号参数外,还可以指定成Qtcore.QVariant类型。在这种情况下,可传送任何类型的数据:

 mysignal = QtCore.pyqtSignal(QtCore.QVariant)
    . . .
   self.mysignal.emit(20)
   self.mysignal.emit("你好!")
   self.mysignal.emit([1, "2"])

相关文章

网友评论

      本文标题:PyQt5编程(13):信号的产生

      本文链接:https://www.haomeiwen.com/subject/cqlxnxtx.html