zoukankan      html  css  js  c++  java
  • Python pyQt4/PyQt5 学习笔记4(事件和信号)

    信号 & 槽

     1 import sys
     2 from PyQt5.QtCore import Qt
     3 from PyQt5.QtWidgets import (QWidget,QLCDNumber,QSlider,QVBoxLayout,QApplication)
     4 
     5 class Example(QWidget):
     6     def __init__(self):
     7         super().__init__()
     8         self.initUI()
     9 
    10     def initUI(self):
    11         lcd=QLCDNumber(self)
    12         sld=QSlider(Qt.Horizontal,self)
    13 
    14         vbox=QVBoxLayout()
    15         vbox.addWidget(lcd)
    16         vbox.addWidget(sld)
    17         self.setLayout(vbox)
    18 
    19         #这里,我们将滑块条的valueChanged信号和lcd数字显示的display槽连接在一起。
    20         #槽是对信号做出反应的方法。
    21         sld.valueChanged.connect(lcd.display)
    22 
    23         self.setGeometry(300,300,250,150)
    24         self.setWindowTitle('Singal & slot')
    25         self.show()
    26 
    27 if __name__=='__main__':
    28     app=QApplication(sys.argv)
    29     ex=Example()
    30     sys.exit(app.exec())

    重写事件处理函数

    PyQt中的事件处理通常通过重写事件处理函数来处理。

     1 #重写事件处理函数,这个例子重写了keyPressEvent()事件处理函数
     2 #如果我们点击了Esc按钮,应用将会被终止
     3 import sys
     4 from PyQt5.QtCore import Qt
     5 from PyQt5.QtWidgets import QWidget,QApplication
     6 
     7 class Example(QWidget):
     8     def __init__(self):
     9         super().__init__()
    10         self.initUI()
    11 
    12     def initUI(self):
    13         self.setGeometry(300,300,250,150)
    14         self.setWindowTitle('event handler')
    15         self.show()
    16 
    17     #例子中,我们重写了keyPressEvent()事件处理函数
    18     def keyPressEvent(self, e):
    19         if e.key()==Qt.Key_Escape:
    20             self.close()
    21 
    22 
    23 if __name__=='__main__':
    24     app=QApplication(sys.argv)
    25     ex=Example()
    26     sys.exit(app.exec())

    事件发送者

    有时需要方便的知道哪一个组件是信号发送者。因此,PyQt5拥有了sender()方法来解决这个问题。

     1 import sys
     2 from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
     3 
     4 
     5 class Example(QMainWindow):
     6 
     7     def __init__(self):
     8         super().__init__()
     9         self.initUI()
    10 
    11     def initUI(self):
    12         btn1 = QPushButton("Button 1", self)
    13         btn1.move(30, 50)
    14 
    15         btn2 = QPushButton("Button 2", self)
    16         btn2.move(150, 50)
    17 
    18         #在buttonClikced()方法中,我们调用sender()方法来判断哪一个按钮是我们按下的
    19         #两个按钮都连接到了同一个槽中
    20         btn1.clicked.connect(self.buttonClicked)
    21         btn2.clicked.connect(self.buttonClicked)
    22 
    23         self.statusBar()
    24 
    25         self.setGeometry(300, 300, 290, 150)
    26         self.setWindowTitle('Event sender')
    27         self.show()
    28 
    29     #我们调用sender()方法判断发送信号的信号源是哪一个。
    30     # 然后在应用的状态栏上显示被按下的按钮的标签内容。
    31     def buttonClicked(self):
    32         sender = self.sender()
    33         self.statusBar().showMessage(sender.text() + ' was pressed')
    34 
    35 
    36 if __name__ == '__main__':
    37     app = QApplication(sys.argv)
    38     ex = Example()
    39     sys.exit(app.exec_())

    发送信号

    从QObejct生成的对象可以发送信号。在下面的例子中我们将会看到怎样去发送自定义的信号。

     1 #创建一个新的信号叫做closeApp。当触发鼠标点击事件时信号会被发射。
     2 # 信号连接到了QMainWindow的close()方法
     3 import sys
     4 from PyQt5.QtCore import pyqtSignal, QObject
     5 from PyQt5.QtWidgets import QMainWindow, QApplication
     6 
     7 
     8 #信号使用了pyqtSignal()方法创建,并且成为外部类Communicate类的属性。
     9 class Communicate(QObject):
    10     closeApp = pyqtSignal()
    11 
    12 
    13 class Example(QMainWindow):
    14 
    15     def __init__(self):
    16         super().__init__()
    17 
    18         self.initUI()
    19 
    20     def initUI(self):
    21         #把自定义的closeApp信号连接到QMainWindow的close()槽上。
    22         self.c = Communicate()
    23         self.c.closeApp.connect(self.close)
    24 
    25         self.setGeometry(300, 300, 290, 150)
    26         self.setWindowTitle('Emit signal')
    27         self.show()
    28 
    29     #当我们在窗口上点击一下鼠标,closeApp信号会被发射。应用中断。
    30     def mousePressEvent(self, event):
    31         self.c.closeApp.emit()
    32 
    33 
    34 if __name__ == '__main__':
    35     app = QApplication(sys.argv)
    36     ex = Example()
    37     sys.exit(app.exec_())
  • 相关阅读:
    HDU-1115计算几何
    树形DP入门之HDU 1296
    拓扑排序-POJ1964
    其他一些数状数组的题
    HDU 2852(树状数组plus二分)
    POJ-2155二维树状数组
    HDOJ 1166 敌兵布阵 (线段树)
    codevs 1082 线段树练习3 (线段树)
    codevs 1081 线段树练习2 (线段树)
    codevs 1080 线段树练习(线段树)
  • 原文地址:https://www.cnblogs.com/hackpig/p/8284431.html
Copyright © 2011-2022 走看看