PyQt5信号与槽详解

1、信号与槽函数基础‘‘‘信号与槽函数基础,信号是一个事件,发射信号之后槽函数就会执行‘‘‘from PyQt5.QtWidgets import *import sys

class signal(QWidget):    def __init__(self):        super(signal,self).__init__()        self.initUI()

    #编辑控件及其关联的信号    def initUI(self):        self.resize(300,200)        self.setWindowTitle("信号与槽函数基础")

        self.b = QPushButton("我的按钮",self)  #利用第二个参数self直接可以显示在窗口,不用布局来进行添加控件

        #信号与槽函数连接        self.b.clicked.connect(self.onclick)

    #编辑槽函数    def onclick(self):        self.b.setText("信号已经发出")        self.b.setStyleSheet("QPushButton(max-width:300px;min-width:300px)")

if __name__=="__main__":    app=QApplication(sys.argv)    p=signal()    p.show()    sys.exit(app.exec_())

2、自定义信号‘‘‘对于一个大类的对象,可以自定义实现一种信号自定义信号的方式pyqtSignal()信号对象‘‘‘

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

#定义一个信号类class MyTypesignal(QObject):

    #定义一个信号    senmsg=pyqtSignal(object)    #编写一个信号相关触发的触发函数    def run(self):        self.senmsg.emit("hello PyQT5")  #通过run方法来发出message信息hello PyQt5

#定义一个槽函数类class MySlot(QObject):    def get(self,msg):        print("信息:"+msg)

if __name__ == "__main__":    send=MyTypesignal()    slot=MySlot()

    #将信号与槽函数连接    send.senmsg.connect(slot.get)    send.run()    #将信号与槽函数断开    send.senmsg.disconnect(slot.get)    send.run()

3、发射多个参数的信号‘‘‘对于一个信号,可以设置通过一个触发函数,发出多个参数‘‘‘

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

#定义一个信号类class MyTypesignal(QObject):

    #定义一个信号    senmsg=pyqtSignal(object) #指定发出一个参数,类型为object对象  #发射3个参数的信号  senmsg1=pyqtSignal(str,int,int)

    #编写一个信号相关触发的触发函数    def run(self):        self.senmsg.emit("hello PyQT5")  #通过run方法来发出message信息hello PyQt5

    def run1(self):        self.senmsg1.emit("hello PyQT5",3,4)  # 通过run方法来发出message信息hello PyQt5

#定义一个槽函数类class MySlot(QObject):    def get(self,msg):        print("信息:"+msg)    def get1(self,msg,a,b):        print(msg,a,b)

if __name__ == "__main__":    send=MyTypesignal()    slot=MySlot()

    #将信号与槽函数连接    send.senmsg.connect(slot.get)    send.senmsg1.connect(slot.get1)    send.run()    send.run1()    #将信号与槽函数断开    send.senmsg.disconnect(slot.get)    send.senmsg1.disconnect(slot.get1)    send.run()    send.run1()

4、为类添加多个信号‘‘‘为一个类添加多个信号(重载形式信号)对于一个重载多种形式的参数信号,触发和关联时都需要指定参数类型‘‘‘

from PyQt5.QtCore import *#定义一个信号类class multisignal(QObject):

    #定义一个信号    signal1=pyqtSignal()    #定义一个信号的传入参数为int类型    signal2=pyqtSignal(int)

    signal3=pyqtSignal(int,str)

    signal4=pyqtSignal(list)

    signal5=pyqtSignal(dict)

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

    def __init__(self):        super(multisignal,self).__init__()

        self.signal1.connect(self.signalcall1)        self.signal2.connect(self.signalcall2)        self.signal3.connect(self.signalcall3)        self.signal4.connect(self.signalcall4)        self.signal5.connect(self.signalcall5)

        #关联槽函数时需要指定传入参数类型,对于多个发射参数形式的信号在了解时需要指定类型,不然默认第一种情况        self.signal6[int,str].connect(self.signalcall6)        self.signal6[str].connect(self.signalcall6overload)

        self.signal1.emit()        self.signal2.emit(10)        self.signal3.emit(1,"hello")        self.signal4.emit([1,2,3,4])        self.signal5.emit({"name":"燕江依","sex":"male"})

        #发出参数时也需要指定信号的参数类型,默认关联到第一种类型上去,也就是int+str类型        self.signal6[int,str].emit(20,"test")        self.signal6[str].emit("text")

    def signalcall1(self):        print("signal1 emit")    def signalcall2(self,val):        print("signal2 emit,value:",val)    def signalcall3(self,val,text):        print("signal3 emit",val,text)    def signalcall4(self, val):        print("signal4 emit,value:", val)    def signalcall5(self,val):        print("signal6 emit",val)    def signalcall6(self, val,text):        print("signal6 emit,value:", val,text)    def signalcall6overload(self, val):        print("signal6 overload emit,value:", val)

if __name__ == "__main__":    mul=multisignal()

5、多线程更新UI数据(利用信号与槽函数在两个线程之间传递数据)from PyQt5.QtCore import QThread,pyqtSignal,QDateTimefrom PyQt5.QtWidgets import QApplication,QDialog,QLineEditimport timeimport sys

#定义一个动态显示当前时间的线程类class back(QThread):    update_date=pyqtSignal(str)    def run(self):        while True:            date=QDateTime.currentDateTime()            current=date.toString("yyyy-MM-dd hh:mm:ss")            self.update_date.emit(str(current))            time.sleep(1)

#定义一个主窗口class threadupdate(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=back()        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)    p=threadupdate()    p.show()    sys.exit(app.exec_())

6、信号与槽函数实现自动连接‘‘‘实现的方法详解如下:1、定义控件的名称,设置控件与信号连接的原则,以名称自动连接self.button.setObjectName("objectname")QtCore.QMetaObject.connectSlotsByName(self)2、槽函数格式为:@QtCore.pyqtSlot()def on_objectname_signalname(self):3、参数说明(1)objectname必须和关联控件名称一致(2)signalname必须和控件所需要关联的信号名称一致‘‘‘

from PyQt5 import QtCorefrom PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButtonimport sys

class autosignalslot(QWidget):    def __init__(self):        super(autosignalslot,self).__init__()        self.ok=QPushButton("OK",self)

        #第一步设置关联信号控件按钮的名字        self.ok.setObjectName("okbutton")        self.cancle = QPushButton("cancel",self)        self.cancle.setObjectName("canclebutton")

        #第二步:设置信号与控件连接的原则        QtCore.QMetaObject.connectSlotsByName(self)

        layout = QHBoxLayout()        layout.addWidget(self.ok)        layout.addWidget(self.cancle)        self.setLayout(layout)

        #使用手动定义关联关系来进行信号与槽函数的匹配        #self.ok.clicked.connect(self.on_okbutton)

    #第三步:定义槽函数:采用自动信号与槽函数之间的关联    @QtCore.pyqtSlot()    def on_okbutton_clicked(self):        print("点击了ok按钮")

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

if __name__=="__main__":    app=QApplication(sys.argv)    p=autosignalslot()    p.show()    sys.exit(app.exec_())

7、信号与槽函数连接与断开N对N连接‘‘‘1.一个信号关联多个槽函数2.一个槽函数可以被多个信号关联3.一个信号可以关联另外一个信号可以实现触发另外一个信号‘‘‘from PyQt5.QtCore import *

class NNsignal(QObject):    signal1=pyqtSignal()    signal2=pyqtSignal(int)    signal3=pyqtSignal(int)

    def __init__(self):        super(NNsignal,self).__init__()        #一个信号关联多个槽函数        self.signal1.connect(self.call1)        self.signal1.connect(self.call2)        self.signal2.connect(self.call3)

        #信号2触发信号3,信号关联信号,需要注意信号传入参数的一致性,不然触发不了        self.signal2.connect(self.signal3)  #信号2和信号3关联,直接会触发信号3关联的槽函数        #一个槽函数被多个信号关联        self.signal3.connect(self.call3)

        self.signal1.emit()  #一个信号触发多个槽函数        self.signal2.emit(100)        self.signal2.emit(2)

    def call1(self):        print("call1 emit")    def call2(self):        print("call2 emit")    def call3(self,int):        print("call3 emit",int)

if __name__ == "__main__":    mul=NNsignal()

8、为窗口添加关闭窗口信号

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

class winsignal(QWidget):    buttonsignal=pyqtSignal()

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

        b=QPushButton("关闭窗口",self)        b.clicked.connect(self.b_click)        self.buttonsignal.connect(self.b_close)    def b_click(self):        self.buttonsignal.emit()    def b_close(self):        self.close()if __name__=="__main__":    app=QApplication(sys.argv)    p=winsignal()    p.show()    sys.exit(app.exec_())

9、lambda表达式为槽函数传递参数‘‘‘python中的lambda表达式:没有名字的函数:即匿名函数‘‘‘#不带参数的函数定义fun=lambda :print("hello world")fun()#带参数函数的定义f=lambda x,y:x*y**2print(f(3,4))

from PyQt5.QtWidgets import *import sysclass lambdaslot(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle("使用lambda表达式为槽函数传递参数")

        self.b1=QPushButton("按钮1")        self.b2=QPushButton("按钮2")

        #相当于click点击信号+lamda表达式便可以实现点击传入槽函数参数        self.b1.clicked.connect(lambda: self.onbutton(10, 20))        self.b2.clicked.connect(lambda: self.onbutton(10, -20))        self.b1.clicked.connect(lambda :QMessageBox.information(self,"结果","单击了button1"))

        lay=QHBoxLayout()        lay.addWidget(self.b1)        lay.addWidget(self.b2)

        m=QWidget()        m.setLayout(lay)        self.setCentralWidget(m)    #槽函数需要参数,而button点击不能传入参数,可以使用lambda表达式传入参数    def onbutton(self,m,n):        print("m+n=",m+n)        QMessageBox.information(self,"结果",str(m+n))

if __name__ == "__main__":    app = QApplication(sys.argv)    p =lambdaslot()    p.show()    sys.exit(app.exec_())

10、partial对象为槽函数传递参数‘‘‘python中的lpartial对象partial(f,参数1,参数2,...)‘‘‘

from PyQt5.QtWidgets import *import sysfrom functools import partial

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

        self.b1=QPushButton("按钮1")        self.b2=QPushButton("按钮2")

        #相当于click点击信号+lamda表达式便可以实现点击传入槽函数参数        self.b1.clicked.connect(partial(self.onbutton,10,20))        self.b2.clicked.connect(partial(self.onbutton,20,-40))

        lay=QHBoxLayout()        lay.addWidget(self.b1)        lay.addWidget(self.b2)

        m=QWidget()        m.setLayout(lay)        self.setCentralWidget(m)

    #槽函数需要参数,而button点击不能传入参数,可以使用partial对象传入参数    def onbutton(self,m,n):        print("m+n=",m+n)        QMessageBox.information(self,"结果",str(m+n))

if __name__ == "__main__":    app = QApplication(sys.argv)    p =partialslot()    p.show()    sys.exit(app.exec_())

11、覆盖槽函数(键盘按键信号连接自定义槽函数)‘‘‘覆盖槽函数‘‘‘

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

#按键信号与槽函数进行关联,自定义属性class overrideslot(QWidget):    def __init__(self):        super().__init__()        self.setWindowTitle("覆盖槽函数")

    #系统里面的按键槽函数与信号连接,可以自定义槽函数里面的功能    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)    p =overrideslot()    p.show()    sys.exit(app.exec_())




原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12315797.html

时间: 2024-10-11 19:44:21

PyQt5信号与槽详解的相关文章

PyQt5 信号和槽

信号发出,连接的槽函数即可运行. 通用表达式:widget.signal.connect(slot) import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(600,400) self.setW

Linux信号signal用法详解及注意事项

信号是软件中断,是一种异步通信方式,处理异步的事件.例如我们在终端中运行程序,通过按下键盘"Ctrl+c",可以发出一个SIGINT中断信号去停止程序运行.信号的处理有3种方法:1.  忽略该信号,大多数信号都可以如此处理.但是SIGKILL和SIGSTOP除外,决不能被忽略.2.  捕获信号,用户自定义一个信号处理函数,当信号发生时,就会触发调用该自定义信号函数.信号SIGKILL和SIGSTOP不能被捕获.3.  系统默认动作, 大多数信号的默认动作是终止该进程.有些信号会&quo

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP

Linux信号详解

Linux信号详解 一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于 SIGRTMIN的都是非可靠信号. 非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信 号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值 位于 [SIGRTM

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号, signals.engine_started当Scrapy引擎启动爬取时发送该信号.该信号支持返回deferreds.signals.engine_stopped当Scrapy引擎停止时发送

PyQt5信号-槽机制

signal -> emit -> slot signal.connect(slot) signal.disconnect(slot) 信号 (singal) 可以连接无数多个槽 (slot),或者没有连接槽也没有问题,信号也可以连接其他的信号. 连接的基本语句形式如下: who.singal.connect(slot) 信号是 QObject 的一个属性.只有通过 connect方法连接起来,信号-槽机制就建立起来了.类似的信号还有 disconnect 方法和emit 方法. discon

linux系统下信号详解2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往另一个进程.例如,用户在后台启动了一个要运行较长时间的程序,如果想中断其执行,可以用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的执行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号可以中断一个进程,而不管它正在作什么工作.由于信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.由于信号本身不能直接携带信息,这就限制了它

详解linux进程间通信-信号

前言:之前说看<C++ Primer >暂时搁浅一下,迷上公司大神写的代码,想要明白,主要是socket.进程间通信! 知道进程间通信:信号.信号量.管道.消息队列.共享内存(共享存储),也能写些简单代码进行通信,但不知道应用在哪?感觉很多小伙伴跟我有类似经历吧? 一.应用实例: 要去linux设备上去添加.改密用户:本地去linux设备添加用户,用socket实现,其实大神改的ssh源码来实现的,这不是我要讲的重点,而我要讲的是准备过程,去登陆linux设备,要准备好:管理员.密码等. 简略

PyQt5(3)——信号和槽初探

信号和槽是QT的核心机制(当信号发射时,链接的槽函数会自动执行) 在pyqt5中信号和槽通过 QObject.signal.connect()链接. QObject类或子类(QWidget)派生的类都包含信号和槽.对象改变状态,信号由该对象发射出去. 三种方法来处理槽函数: ① UI设计加入 ②代码链接 ③Eric生成的对话框代码 现在我们简单写一个 使用关闭按钮  来 关闭窗口   的效果 建立UI文件 选择  编辑-->信号和槽 鼠标左键点击关闭按钮不动,拖动到from窗口. 弹出配置对话框