1 信号-插槽 事件
1.1 连接方式
1.1.1 组件方法(connect())
| connect 方法连接信号和插槽 |
|
python from PyQt6.QtWidgets import * import sys class QWindow(QMainWindow): def __init__(self): super().__init__() self.Init_UI() def Init_UI(self): self.btn = QPushButton('歪日') # .connect(self.实例方法) 即可连接 self.btn.clicked.connect(self._print) self.setCentralWidget(self.btn) self.show() def _print(self): print('歪日') if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() app.exit(app.exec()) |
1.1.2 装饰器(@pyqtSlot())
| @pyqtSlot() 装饰器连接信号和插槽 |
|
python from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt6.QtCore import pyqtSlot import sys class QWindow(QMainWindow): def __init__(self): super().__init__() self.Init_UI() def Init_UI(self): pushButton = QPushButton('歪日') self.setCentralWidget(pushButton) self.show() # 看各种帖子,应该是这么使用,但从未成功,求各路大佬指点 @pyqtSlot(bool) def on_pushButton_clicked(self): print('歪日') if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() app.exit(app.exec()) |
外部信号(pyqtSignal QObject)
from PyQt6.QtCore import (pyqtSignal, QObject)# 使用 QObject 自制外部类class Signal(QObject):# 使用 pyqtSignal 作为 Signal类的属性 ps = pyqtSignal()class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 类的实例化 self.s = Signal() # self.s.ps.connect(self.实例方法) self.show() def 实例方法(): pass
接收多信号插槽(sender)
| 通过 sender 属性判断 |
|
python import sys from PyQt6.QtWidgets import (QApplication, QMessageBox, QMainWindow, QPushButton) class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(200, 200, 300, 250) bt1 = QPushButton('你好',self) bt1.setGeometry(100,50,100,50) bt2 = QPushButton('再见',self) bt2.setGeometry(100,150,100,50) bt1.clicked.connect(self.saysomething) bt2.clicked.connect(self.saysomething) self.show() def saysomething(self): # sender()方法用来确定信号源 sender = self.sender() # 使用信号源的方法/属性 if sender.text() == '你好': # sender代表每个内部组件对象 QMessageBox.about(self, '问候', '你好啊,大兄弟!!!') else: QMessageBox.about(self, '问候', '去你的吧,歪日!!!') if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() sys.exit(app.exec()) |
|
| 通过 sender 本身判断 |
|
python import sys from PyQt6.QtWidgets import (QApplication, QMessageBox, QMainWindow, QPushButton) class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(200, 200, 300, 250) self.bt1 = QPushButton('你好',self) self.bt1.setGeometry(100,50,100,50) self.bt2 = QPushButton('再见',self) self.bt2.setGeometry(100,150,100,50) self.bt1.clicked.connect(self.saysomething) self.bt2.clicked.connect(self.saysomething) self.show() def saysomething(self): # sender()方法用来确定信号源 sender = self.sender() # 使用信号源的方法/属性 if sender == self.bt1: # sender代表每个内部组件对象 QMessageBox.about(self, '问候', '你好啊,大兄弟!!!') else: QMessageBox.about(self, '问候', '去你的吧,歪日!!!') if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() sys.exit(app.exec()) |
QEvent 事件
关闭窗口
键盘监控(QKeyEvent)
|
|
python from PyQt6.QtCore import Qt def keyPressEvent(self, event): # 判断键盘输入信息 if == Qt.Key.Key_Up: # event.key() 返回输入的键盘按键 # Qt.Key.Key_Up 类.枚举名.枚举值,表示键盘 ↑ 键 self.lab.setText('↑') elif event.key() == Qt.Key.Key_Down: self.lab.setText('↓') elif event.key() == Qt.Key.Key_Left: self.lab.setText('←') elif event.key() == Qt.Key.Key_Right: self.lab.setText('→') |
|
| QT.Key 枚举 |
|
| [Qt Namespace |
Qt Core 6.3.2](https://doc.qt.io/qt-6/qt.html#Key-enum) |
鼠标位置监测(QMouseEvent)
import sysfrom PyQt6.QtWidgets import (QApplication, QLabel, QWidget)from PyQt6.QtGui import QPainter, QColor, QPenfrom PyQt6.QtCore import Qtclass Example(QWidget): distance_from_center = 0 def __init__(self): super().__init__() self.initUI() self.setMouseTracking(True) def initUI(self): self.setGeometry(200, 200, 1000, 500) self.setWindowTitle('学点编程吧') self.label = QLabel(self) self.label.resize(500, 40) self.show() self.pos = None def mouseMoveEvent(self, event): # 当前定点与中心点距离 distance_from_center = round(((event.position().y() - 250)**2 + (event.position().x() - 500)**2)**0.5) # (500,250)为中点坐标(x,y) # event.position().y()返回鼠标相对于窗口起点的坐标; # position 为 QMouseEvent 的枚举名,x()/y() 为枚举值; # 将获取信息填入标签中 self.label.setText('坐标: ( x: %d ,y: %d )' % (event.position().x(), event.position().y()) + " 离中心点距离: " + str(distance_from_center)) # 将坐标信息设定为实例变量,来传递给其他实例函数(画板) self.pos = event.pos() # event.pos 等同于 event.position # 更新:重新获得鼠标坐标 self.update() # 必须有该语句,才能实现每次移动鼠标信息都更新 def paintEvent(self, event): if self.pos: q = QPainter(self) q.drawLine(0, 0, self.pos.x(), self.pos.y())if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec())
List of All Members for QMouseEvent | Qt GUI 6.3.2
PyQt5 升到 PyQt6 时,QMouseEvent.x() 和 QMouseEvent.y() 废除,并改为 QMouseEvent.position().x() 和 QMouseEvent.position().y()。更多QMouseEvent变动见官方文档:
Obsolete Members for QMouseEvent | Qt GUI 6.3.2
鼠标左键监测
import sysfrom PyQt6.QtWidgets import (QApplication, QMessageBox, QMainWindow)class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(250, 250, 250, 250) self.show() # 鼠标左键监测,点击左键即触发 def mousePressEvent(self, e): QMessageBox.about(self,'标题','点击触发')if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() sys.exit(app.exec())
事件分步书写(pyqtSignal)
| 事件分步书写 — pyqtSignal |
|
python import sys from PyQt6.QtWidgets import (QApplication, QMessageBox, QMainWindow) class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(250, 250, 250, 250) self.show() def mousePressEvent(self, e): # QEvent 事件标准写法 QMessageBox.about(self,'标题','点击触发') if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() sys.exit(app.exec()) |
python import sys from PyQt6.QtWidgets import (QApplication, QMessageBox, QMainWindow) # 分步写,需要pyqtSignal和QObject库 from PyQt6.QtCore import (pyqtSignal, QObject) # 创建类,类属性返回一个无参数信号 class Signal(QObject): ps = pyqtSignal() class QWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(250, 250, 250, 250) # 类实例化,引用第三方类 self.Signal = Signal() # 将信号连接到指定槽 self.Signal.ps.connect(self.msgbox) self.show() # 槽函数(用于接收信号) def msgbox(self): QMessageBox.about(self,'标题','点击触发') def mousePressEvent(self, e): # 发射信号(监测到鼠标左键点击即发射) self.Signal.ps.emit() if __name__ == '__main__': app = QApplication(sys.argv) ex = QWindow() sys.exit(app.exec()) |
事件过滤器???
PyQt5系列教程(12):构建我们自己的密码输入框