zoukankan      html  css  js  c++  java
  • 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_())
    
    

    
    
  • 相关阅读:
    flask(十)使用alembic,进行数据库结构管理,升级,加表,加项
    Python sqlalchemy使用
    flask+script命令行交互工具
    flask+APScheduler 任务调度,计划任务,定时任务
    DBA日常工作职责
    Oracle 的 VKTM 进程
    linux
    UF2.0、O4、UFT、TA众明星背后的秘密
    ORA-01502: 索引或这类索引的分区处于不可用状态
    关于Optimizer_index_cost_adj参数的设置
  • 原文地址:https://www.cnblogs.com/liming19680104/p/10353859.html
Copyright © 2011-2022 走看看