pyqt5学习信号槽

文章介绍了PyQt5中信号和槽的概念及其使用,包括自定义信号、多参数信号、类添加多个信号、N对N连接、窗口信号、主线程更新UI数据、信号和槽的自动连接以及如何通过lambda匿名表达式和partial为槽函数传参。同时展示了覆盖默认槽函数的方法。
摘要由CSDN通过智能技术生成

自定义信号槽

from PyQt5.QtCore import *


class MyTypeSignal(QObject):
    # 定义一个信号
    sendmsg = pyqtSignal(object)

    def run(self):
        self.sendmsg.emit("hello pyqt5")


class MySlot(QObject):
    def get(self, msg):
        print("信息:" + msg)


if __name__ == "__main__":
    send = MyTypeSignal()
    slot = MySlot()
    send.sendmsg.connect(slot.get)
    send.run()

    #断开
    send.sendmsg.disconnect(slot.get)
    send.run()


多参数信号

from PyQt5.QtCore import *


class MyTypeSignal(QObject):
    # 定义一个信号
    sendmsg = pyqtSignal(object)
    # 发送3个参数的信号
    sendmsg1 = pyqtSignal(str, int, int)

    def run(self):
        self.sendmsg.emit("hello pyqt5")

    def run1(self):
        self.sendmsg1.emit("hello", 3, 4)


class MySlot(QObject):
    def get(self, msg):
        print("信息:" + msg)

    def get1(self, msg, a, b):
        print(msg)
        print(a + b)


if __name__ == "__main__":
    send = MyTypeSignal()
    slot = MySlot()
    send.sendmsg.connect(slot.get)
    send.sendmsg1.connect(slot.get1)
    send.run()
    send.run1()

    # # 断开
    # send.sendmsg.disconnect(slot.get)
    # send.run()

类添加多个信号

from PyQt5.QtCore import *


class MultSingal(QObject):
    singal1 = pyqtSignal()
    singal2 = pyqtSignal(int)
    singal3 = pyqtSignal(int, str)
    singal4 = pyqtSignal(list)
    singal5 = pyqtSignal(dict)

    # 声明一个重载版本的信号,也就是函数的参数可以是int和str类型,也可以是只有一个str类型的参数
    singal6 = pyqtSignal([int, str], [str])

    def __init__(self):
        super(MultSingal, self).__init__()
        self.singal1.connect(self.singalcall1)
        self.singal2.connect(self.singalcall2)
        self.singal3.connect(self.singalcall3)
        self.singal4.connect(self.singalcall4)
        self.singal5.connect(self.singalcall5)
        self.singal6[str].connect(self.singalcall6overload)  # 定义需要参数类型
        self.singal6[int, str].connect(self.singalcall6)

        self.singal1.emit()
        self.singal2.emit(10)
        self.singal3.emit(1, "hello")
        self.singal4.emit([1, 2, 3, 4, 5, 6])
        self.singal5.emit({"name:": "bill", "age": 30})
        self.singal6[str].emit("test")  # 调用也要定义参数类型
        self.singal6[int, str].emit(100, "mytest")

    def singalcall1(self):
        print("singal1 emit")

    def singalcall2(self, val):
        print("singal2 emit,value:", val)

    def singalcall3(self, val, text):
        print("singal3 emit,value", val, text)

    def singalcall4(self, val):
        print("singal4 emit", val)

    def singalcall5(self, val):
        print("singal5 emit,value:", val)

    def singalcall6(self, val, text):
        print("singal6 emit,value", val, text)

    def singalcall6overload(self, val):
        print("singal6 emit,value", val)


if __name__ == "__main__":
    multsignal = MultSingal()

N对N连接

from PyQt5.QtCore import *


class NNSingal(QObject):
    singal1 = pyqtSignal()
    singal2 = pyqtSignal(int)
    singal3 = pyqtSignal()

    def __init__(self):
        super(NNSingal, self).__init__()
        self.singal1.connect(self.call1)
        self.singal1.connect(self.call11)
        self.singal1.emit()
        self.singal2.connect(self.singal1)
        self.singal2.emit(10)  # 本质触发信号1

        self.singal1.disconnect(self.call1)  # 断开链接
        self.singal1.disconnect(self.call11)
        self.singal2.disconnect(self.singal1)

        self.singal1.connect(self.call1)  # 重新链接
        self.singal2.connect(self.call2)
        self.singal3.connect(self.call1)
        self.singal1.emit()
        self.singal2.emit(10)
        self.singal3.emit()

    def call1(self):
        print("call emit")

    def call11(self):
        print("call11 emit")

    def call2(self, val):
        print("call2 emit:", val)


if __name__ == "__main__":
    nnsingal = NNSingal()

窗口添加信号

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys


class winsingal(QWidget):
    button_clicked_singal = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.setWindowTitle("为窗口类添加信号")
        self.resize(300, 100)

        btn = QPushButton("关闭窗口", self)
        # btn.clicked.connect(self.close)  # 下面几行相对于这一行
        btn.clicked.connect(self.btn_clicked)
        self.button_clicked_singal.connect(self.btn_close)

    def btn_clicked(self):
        self.button_clicked_singal.emit()

    def btn_close(self):
        self.close()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = winsingal()
    example.show()
    sys.exit(app.exec())

主线程更新UI数据

from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit
import time
import sys


class BackendThread(QThread):
    update_date = pyqtSignal(str)

    def run(self):
        while True:
            data = QDateTime.currentDateTime()
            currentTime = data.toString("yyyy-MM-dd hh:mm:ss")
            self.update_date.emit(str(currentTime))


class ThreadUpdateUI(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setWindowTitle("多线程UI更新")
        self.resize(400, 100)
        self.input = QLineEdit(self)  # 文本框
        self.input.resize(400, 100)
        self.initUI()

    def initUI(self):
        self.backend = BackendThread()
        self.backend.update_date.connect(self.handledisplay)
        self.backend.start()

    def handledisplay(self, data):
        self.input.setText(data)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = ThreadUpdateUI()
    example.show()
    sys.exit(app.exec())

信号和槽自动连接

from PyQt5 import QtCore
from PyQt5.QtWidgets import *
import sys


class AutoSingalSlot(QWidget):
    def __init__(self):
        super(AutoSingalSlot, self).__init__()
        self.okbutton = QPushButton("ok", self)
        self.okbutton.setObjectName("okbutton")
        self.cancelbutton = QPushButton("cancel", self)
        self.cancelbutton.setObjectName("cancelbutton")
        layout = QHBoxLayout()
        layout.addWidget(self.okbutton)
        layout.addWidget(self.cancelbutton)
        self.setLayout(layout)
        QtCore.QMetaObject.connectSlotsByName(self)

    @QtCore.pyqtSlot()
    def on_okbutton_clicked(self):  # 根据命名规则识别
        print("点击了ok按钮")

    @QtCore.pyqtSlot()
    def on_cancelbutton_clicked(self):
        print("点击了cancel按钮")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = AutoSingalSlot()
    example.show()
    sys.exit(app.exec())

lambda匿名表达式给槽函数传参

from PyQt5.QtWidgets import *
import sys


class LambdaSlotArg(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("使用lambda表达式为槽函数传递参数")

        button1 = QPushButton("按钮1")
        button2 = QPushButton("按钮2")
        button1.clicked.connect(lambda: self.onButtonClick(10, 20))  # lambda没有名字的函数
        button2.clicked.connect(lambda: self.onButtonClick(-200, 20))
        button1.clicked.connect(lambda: QMessageBox.information(self, "结果", "单击了button1"))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)

    def onButtonClick(self, m, n):
        print("m + n", str(m + n))
        QMessageBox.information(self, "结果", str(m + n))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = LambdaSlotArg()
    example.show()
    sys.exit(app.exec())

partial给槽函数传参

from PyQt5.QtWidgets import *
import sys
from functools import partial


class LambdaSlotArg(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("使用partial为槽函数传递参数")

        button1 = QPushButton("按钮1")
        button2 = QPushButton("按钮2")
        button1.clicked.connect(partial(self.onButtonClick, 10, 20))  # lambda没有名字的函数
        button2.clicked.connect(partial(self.onButtonClick, -200, 20))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)

    def onButtonClick(self, m, n):
        print("m + n", str(m + n))
        QMessageBox.information(self, "结果", str(m + n))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = LambdaSlotArg()
    example.show()
    sys.exit(app.exec())

override(覆盖)槽函数

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class OverrideSlot(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Override(覆盖)槽函数")

    def keyPressEvent(self, e):  # 覆盖系统初始定义的槽函数
        if e.key() == Qt.Key_Escape:  # 添加自己的业务代码
            self.close()
        elif e.key() == Qt.Key_Alt:
            self.setWindowTitle("按下ALT键")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = OverrideSlot()
    example.show()
    sys.exit(app.exec())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值