0 前言
1 传递信号
内置信号使用connect
连接槽函数
1.1 常见内置信号
鼠标点击信号 | 说明 |
---|---|
self.clicked.connect(fun) | 单击信号,传递self |
self.toggled.connect(fun) | 触发信号,传递self |
self.itemClicked.connect(fun) | 单击条目信号,传递(self, item) |
self.itemDoubleClicked.connect(fun) | 双击条目信号,传递(self, item) |
self.currentIndexChanged.connect(fun) | 选中条目信号,传递(self, idx) |
右键菜单信号 | 说明 |
---|---|
self.setContextMenuPolicy() | 右键菜单功能:Qt.DefaultContextMenu : 默认菜单,重写contextMenuEvent() 实现自定义Qt.NoContextMenu : 无菜单,事件响应传递给部件父级Qt.PreventContextMenu : 无菜单,事件响应不继续传递Qt.ActionsContextMenu : 事件菜单,只响应部件事件,部件子件的事件不响应Qt.CustomContextMenu : 用户自定义菜单,需绑定事件customContextMenuRequested ,并实现 槽函数 |
内容变化信号 | 说明 |
---|---|
self.editingFinished.connect(fun) | 编辑完成信号,传递self |
self.textChanged.connect(fun) | 文本变更信号,传递self |
线程变化信号 | 说明 |
---|---|
self.started.connect(fun) | 线程开始信号,传递self |
self.finished.connect(fun) | 线程结束信号,传递self |
1.2 将所有子构建都作为self
的属性,利用信号默认的self
传递所有数据
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 200)
vlayout = QVBoxLayout()
self.setLayout(vlayout)
self.label = QLabel('关闭')
self.label.setAlignment(Qt.AlignCenter)
vlayout.addWidget(self.label)
self.btn = QPushButton('开关')
self.btn.clicked.connect(self.labelSwitch) # 信号
vlayout.addWidget(self.btn)
def labelSwitch(self): # 槽函数
self.label.setText(self.btn.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
2.3 使用lambda
函数传递所需要的数据
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 200)
vlayout = QVBoxLayout()
self.setLayout(vlayout)
label = QLabel('关闭')
label.setAlignment(Qt.AlignCenter)
vlayout.addWidget(label)
btn = QPushButton('开关')
btn.clicked.connect(lambda: self.labelSwitch(btn, label)) # 信号
vlayout.addWidget(btn)
def labelSwitch(self, btn, label): # 槽函数
label.setText(btn.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
2.4 信号的发送者可以通过self.sender()
方法获得
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 200)
vlayout = QVBoxLayout()
self.setLayout(vlayout)
label = QLabel('关闭')
label.setAlignment(Qt.AlignCenter)
vlayout.addWidget(label)
btn = QPushButton('开关')
btn.clicked.connect(lambda: self.labelSwitch(label)) # 信号
vlayout.addWidget(btn)
def labelSwitch(self, label): # 槽函数
btn = self.sender()
label.setText(btn.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
2 事件处理
控件既可以主动发送信号,也可以被动的等待事件
事件必须写在要触发事件的构建类定义里
事件的函数名已经写好,只能重构,不可变更,常见的事件如下:
2.1 鼠标事件
def mousePressEvent(self, event)
def mouseReleaseEvent(self, event)
def mouseDoubleClickEvent(self, event):
def mouseMoveEvent(self, event)
event
参数是QMouseEvent对象,有以下常用方法:
QMouseEvent类 | 说明 |
---|---|
self.pos() | 返回QPoint类 |
self.button() | 返回触发对象,在PyQt5.QtCore中:Qt.NoButton : 没有按下鼠标键Qt.LeftButton : 按下鼠标左键Qt.RightButton : 按下鼠标右键Qt.MiddleButton : 按下鼠标中键 |
self.buttons() | 返回前面所列枚举值的组合,用于判断同时按下了哪些键 |
self.modifiers() | 判断按下了哪些修饰键Key_Control , Key_Shift , Key_Alt |
案例:
def mouseReleaseEvent(self, event):
# 单击左键
if event.button() == Qt.LeftButton:
print("单击鼠标左键的事件: 自己定义")
# 单击右键
if event.button() == Qt.RightButton:
print("单击鼠标右键的事件: 自己定义")
def mouseDoubleClickEvent(self, event):
# 双击左键
if event.button() == Qt.LeftButton:
print ("鼠标双击事件: 自己定义")
2.2 右键菜单事件
setContextMenuPolicy(Qt.DefaultContextMenu) # 启用默认右键菜单
def contextMenuEvent(self, event): # 重写事件
event
参数是QContextMenyEvent对象,有以下常用方法:
QKeyEvent类 | 说明 |
---|---|
self.pos() | 返回QPoint类 |
2.3 键盘事件
def keyPressEvent(self,event)
event
参数是QKeyEvent对象,有以下常用方法:
QKeyEvent类 | 说明 |
---|---|
self.key() | 获取按键对应的Qt 常量值Key_0 -Key_9 ,Key_A -Key_Z ,Key_F1 -Key_F35 , Key_CapsLock , Key_Tab Key_Enter , Key_Return , Key_Backspace , Key_Space , Key_Shift , Key_Control Key_Alt , Key_Up , Key_Down , Key_Left , Key_Right , |
2.4 离开事件
def closeEvent(self, event):
event
参数是QCloseEvent对象,有以下常用方法:
QCloseEvent类 | 说明 |
---|---|
self.accept() | 关闭窗口 |
self.ignore() | 放弃关闭窗口 |
2.5 拖曳事件
self.setAcceptDrops(True) # 启用拖曳事件
def dragEnterEvent(self, event): # 必须先进入这个时间,选择accept或ignore该拖曳操作
def dragMoveEvent(self, event): # 在拖曳操作进行时会触发该事件
def dragLeaveEvent(self, event): # 当执行一个拖曳操作,并且鼠标指针离开该控件时,这个事件被触发
def DropEvent(self, event): # 当拖曳操作在其目标控件上被释放时,这个事件将被触发
event
参数是QDropEvent对象,有以下常用方法:
QDropEvent类 | 说明 |
---|---|
self.accept() | 接受拖曳事件 |
self.ignore() | 拒绝拖曳事件 |
=self.mimeData() | 返回QMimeData类 |
QMimeData类 | 说明 |
---|---|
=self.hasText() | 判读是否具有text 信息,输出True ,False |
=self.text() | 读取text 信息 |
=self.hasHtml() | 判读是否具有html 信息,输出True ,False |
=self.html() | 读取html 信息 |
=self.hasUrls() | 判读是否具有urls 信息,输出True ,False |
=self.urls() | 读取urls 信息,为文件path列表 |
=self.hasImage() | 判读是否具有image 信息,输出True ,False |
=self.imageData() | 读取image 信息 |
2.6 实例 单击,右击和离开事件
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 200)
vlayout = QVBoxLayout()
self.setLayout(vlayout)
label = MyLabel()
vlayout.addWidget(label)
btn = MyPushButton()
vlayout.addWidget(btn)
def closeEvent(self, event): # 关闭事件
reply = QMessageBox.question(self, '本程序', "是否要退出程序?", QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
class MyLabel(QLabel):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setText('关闭')
self.setAlignment(Qt.AlignCenter)
self.setContextMenuPolicy(Qt.DefaultContextMenu) # 打开右键菜单的策略
def contextMenuEvent(self, event):
menu = QMenu(self)
openFile = menu.addAction('打开文件')
openDir = menu.addAction('打开文件夹')
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == openFile:
print('打开文件')
if action == openDir:
print('打开文件夹')
class MyPushButton(QPushButton):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setText('关闭')
def mouseReleaseEvent(self, event): # 鼠标左击事件
if event.button() == Qt.LeftButton:
print('左击事件')
if self.text() == '关闭':
self.setText('关闭')
else:
self.setText('开启')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())