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)

  1. from PyQt6.QtCore import (pyqtSignal, QObject)
  2. # 使用 QObject 自制外部类
  3. class Signal(QObject):
  4. # 使用 pyqtSignal 作为 Signal类的属性
  5. ps = pyqtSignal()
  6. class Example(QWidget):
  7. def __init__(self):
  8. super().__init__()
  9. self.initUI()
  10. def initUI(self):
  11. # 类的实例化
  12. self.s = Signal()
  13. #
  14. self.s.ps.connect(self.实例方法)
  15. self.show()
  16. def 实例方法():
  17. 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 事件

QT 中的所有事件
[QEvent Class Qt Core 6.3.2](https://doc.qt.io/qt-6/qevent.html)
QT 各种枚举
[Qt Namespace Qt Core 6.3.2](https://doc.qt.io/qt-6/qt.html)

关闭窗口


键盘监控(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)

  1. import sys
  2. from PyQt6.QtWidgets import (QApplication, QLabel, QWidget)
  3. from PyQt6.QtGui import QPainter, QColor, QPen
  4. from PyQt6.QtCore import Qt
  5. class Example(QWidget):
  6. distance_from_center = 0
  7. def __init__(self):
  8. super().__init__()
  9. self.initUI()
  10. self.setMouseTracking(True)
  11. def initUI(self):
  12. self.setGeometry(200, 200, 1000, 500)
  13. self.setWindowTitle('学点编程吧')
  14. self.label = QLabel(self)
  15. self.label.resize(500, 40)
  16. self.show()
  17. self.pos = None
  18. def mouseMoveEvent(self, event):
  19. # 当前定点与中心点距离
  20. distance_from_center = round(((event.position().y() - 250)**2 + (event.position().x() - 500)**2)**0.5)
  21. # (500,250)为中点坐标(x,y)
  22. # event.position().y()返回鼠标相对于窗口起点的坐标;
  23. # position 为 QMouseEvent 的枚举名,x()/y() 为枚举值;
  24. # 将获取信息填入标签中
  25. self.label.setText('坐标: ( x: %d ,y: %d )' % (event.position().x(), event.position().y()) + " 离中心点距离: " + str(distance_from_center))
  26. # 将坐标信息设定为实例变量,来传递给其他实例函数(画板)
  27. self.pos = event.pos() # event.pos 等同于 event.position
  28. # 更新:重新获得鼠标坐标
  29. self.update() # 必须有该语句,才能实现每次移动鼠标信息都更新
  30. def paintEvent(self, event):
  31. if self.pos:
  32. q = QPainter(self)
  33. q.drawLine(0, 0, self.pos.x(), self.pos.y())
  34. if __name__ == '__main__':
  35. app = QApplication(sys.argv)
  36. ex = Example()
  37. 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


鼠标左键监测

  1. import sys
  2. from PyQt6.QtWidgets import (QApplication, QMessageBox, QMainWindow)
  3. class QWindow(QMainWindow):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. def initUI(self):
  8. self.setGeometry(250, 250, 250, 250)
  9. self.show()
  10. # 鼠标左键监测,点击左键即触发
  11. def mousePressEvent(self, e):
  12. QMessageBox.about(self,'标题','点击触发')
  13. if __name__ == '__main__':
  14. app = QApplication(sys.argv)
  15. ex = QWindow()
  16. 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):构建我们自己的密码输入框