pyqt5-信号与槽

 

个人理解:pyqt5的信号就是C++中事件,比如鼠标单击事件;pyqt5中的槽就是c++事件函数,比如单击之后要去执行的函数

例子一 一个信号连接一个槽 

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class Demo(QWidget): # 1
def __init__(self):
super(Demo, self).__init__() #注意:要传入(Demo, self)
self.button = QPushButton('Start', self) # 2
self.button.clicked.connect(self.change_text) # 3

def change_text(self): #槽函数
self.button.setText('Stop') #设置按钮显示的文本
self.button.clicked.disconnect(self.change_text) #信号和槽函数解绑,解绑后再单击按钮也不会执行槽函数
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo() # 6
demo.show() # 7
sys.exit(app.exec_())

#1:该类从QWidget类继承,可以将QWidget看作是一种毛坯房【Demo看作容器】,还没有装修,而我们往其中放入QPushButton、QLabel等控件就相当于在装修这间毛坯房
#2:实例化一个QPushButton,参数self不能忘了(相当于告诉程序这个QPushButton是放在self中);参数1是要显示的文本
#3:连接信号与槽函数。self.button控件被单击时,就去执行函数self.change_text【clicked是信号;self.change_text是槽函数】


例子二 多个信号连接同一个槽

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Start', self)
self.button.pressed.connect(self.change_text) #鼠标左键按下时
self.button.released.connect(self.change_text) #鼠标左键释放时

def change_text(self):
if self.button.text() == 'Start':
self.button.setText('Stop')
else:
self.button.setText('Start')


if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec())

例子三 一个信号连接另一个信号

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.button = QPushButton('Start', self)
self.button.pressed.connect(self.button.released)
#将pressed信号和released信号连接起来,而released信号则与槽函数连接。这样当点击不放时,pressed信号发出,released信号也会发出,从而启动槽函数。释放鼠标则发出released信号,再次启动槽函数
self.button.released.connect(self.change_text) #鼠标左键释放时

def change_text(self):
if self.button.text() == 'Start':
self.button.setText('Stop')
else:
self.button.setText('Start')


if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec())

例子4 一个信号连接多个槽

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(300, 300) #设置窗口大小
self.setWindowTitle('我的qt5练习') #设置窗口标题
self.button = QPushButton('Start', self)
self.button.clicked.connect(self.change_text)
self.button.clicked.connect(self.change_window_size)
self.button.clicked.connect(self.change_window_title)
#鼠标单击信号连接了三个函数

def change_text(self):
self.button.setText('停止')
self.button.clicked.disconnect(self.change_text)

def change_window_size(self):
self.resize(500, 500)
self.button.clicked.disconnect(self.change_window_size)

def change_window_title(self):
self.setWindowTitle('窗口标题发生改变')
self.button.clicked.disconnect(self.change_window_title)

if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec())


例子五---自定义信号

from PyQt5.QtWidgets import QApplication, QWidget,QPushButton
from PyQt5.QtCore import Qt
import sys
from PyQt5.QtCore import pyqtSignal  #自定义信号模块

class Btn(QPushButton):
    #rightclicked= pyqtSignal()  #实例化一个自定义信号,在类内的自定义信号必须是类属性

    #rightclicked= pyqtSignal(str)
    #参数 可选  str---发出信号时向槽函数传递一个字符串

    #rightclicked = pyqtSignal([str],[int])
    #传递的参数有可能是字符串,有可能是整型数据,传递一个参数
    #第一个是默认的

    rightclicked = pyqtSignal([str,int])
    #向槽函数传递两个参数  一个是str类型  一个是int类型

    def mousePressEvent(self, event):  # 鼠标键按下时调用
        super().mousePressEvent(event)  #执行父类的鼠标事件
        #如果不行行父类,父类的鼠标左键单击事件等会被覆盖
        n = event.button()
        if n==Qt.RightButton:
            #self.rightclicked.emit()  #发出自定义信号

            #self.rightclicked.emit('李明')
            #参数 向常函数传递的文本字符串

            #self.rightclicked[str].emit('李明')
            #[str]   表示传递的参数类型是str

            self.rightclicked[str,int].emit('李明',867)


class win(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(300,300)
        self.pb=Btn('按钮',self)
        self.pb.move(50,100)
        self.pb.clicked.connect(self.AA)

        #self.pb.rightclicked.connect(self.BB)
        self.pb.rightclicked[str,int].connect(self.BB)
        #[str]  指明接受的参数类型是str

    def AA(self):
        print('点击了鼠标左键')
    # def BB(self):
    #     print('点击了鼠标右键')

    def BB(self,t,i):
        print('点击了鼠标右键',t,i)


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

 

 装饰器连接信号与槽--根据setObjectName的值连接槽函数

王顺子 388

from PyQt5.QtWidgets import QApplication, QWidget,QPushButton
from PyQt5.QtCore import Qt,pyqtSlot
import sys
from PyQt5 import QtCore


class win(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(300,300)
        self.btn=QPushButton('按钮',self)
        self.btn.move(50,100)
        self.btn.setObjectName('btn')

        QtCore.QMetaObject.connectSlotsByName(self)  #将参数内部的子孙对象的信号, 根据objectName连接到相关的槽函数
        #注意 这句要防止控件创建之后  setObjectName之后


    @pyqtSlot(bool)  #bool 接受数据的类型--可选
    def on_btn_clicked(self,v):#格式:ON_setObjectName的值_信号动作
        print('点击了鼠标左键',v)


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

 





天子骄龙

转载于:https://www.cnblogs.com/liming19680104/p/10353859.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值