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)
class Signal(QObject):
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 sys
from PyQt6.QtWidgets import (QApplication, QLabel, QWidget)
from PyQt6.QtGui import QPainter, QColor, QPen
from PyQt6.QtCore import Qt
class 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)
self.label.setText('坐标: ( x: %d ,y: %d )' % (event.position().x(), event.position().y()) + " 离中心点距离: " + str(distance_from_center))
self.pos = event.pos()
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 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):
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):构建我们自己的密码输入框