文章目录
- 事件
- 事件传递
- 父子关系扩展
- Z轴的层级关系
事件
自定义控件类(QWidget),然后重写对应的事件方法即可。
控件显示时触发,showEvent(QShowEvent)
控件关闭时触发,closeEvent(QCloseEvent)
事件传递
案例:
通过事件监听,如果按下A键 则打印“按下了A”
如果按下了Ctrl + S, 则打印 “Ctrl + S被按下”
如果按下了Ctrl + Shift + S,则打印“Ctrl + Shift + S按下”
普通按键 event.key() == Qt.Key_A/Tab…
修饰键 event.modifiers()
代码:
# __author__ = "laufing"
from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QDesktopWidget
import sys
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
# 窗口标题
self.setWindowTitle("laufing")
# 窗口图标
pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
icon = QIcon()
icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
self.setWindowIcon(icon)
# 设置宽高
self.resize(500, 600)
# 窗口居中
desktop_geo = QDesktopWidget().geometry()
width, height = desktop_geo.width(), desktop_geo.height()
self.move(width/2-self.width()/2, height/2 - self.height()/2)
# 设置文本
self.label = MyLabel(self)
self.label.setText("测试按钮被按下")
self.label.resize(200, 200)
self.label.move(100, 100)
# 文本获取键盘焦点
self.label.grabKeyboard()
# self.label.grabMouse()
class MyLabel(QLabel):
# 重写事件函数
def keyPressEvent(self, evt: QKeyEvent):
print("键盘按下...")
# 判断按下的键
if evt.key() == Qt.Key.Key_A:
print("A 被按下")
# 加修饰按键 的 组合 Ctrl + S
elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier and evt.key() == Qt.Key.Key_S:
print("Ctrl + S 被按下")
# 多个修饰键
elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier \
and evt.key() == Qt.Key.Key_S:
print("Ctrl + Shift + S 被按下")
else:
print("其他按钮...")
if __name__ == '__main__':
# 窗口应用程序
app = QApplication(sys.argv)
window = Window()
window.show()
status_code = app.exec_()
sys.exit(status_code)
案例2:在用户区域,按下鼠标左键,可以拖动窗口,按右键就不可以拖动。
# __author__ = "laufing"
from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QDesktopWidget
import sys
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
# 窗口标题
self.setWindowTitle("laufing")
# 窗口图标
pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
icon = QIcon()
icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
self.setWindowIcon(icon)
# 设置宽高
self.resize(500, 600)
# 窗口居中
desktop_geo = QDesktopWidget().geometry()
width, height = desktop_geo.width(), desktop_geo.height()
self.move(width/2-self.width()/2, height/2 - self.height()/2)
# 设置文本
self.label = MyLabel(self)
self.label.setText("测试按钮被按下")
self.label.resize(200, 200)
self.label.move(100, 100)
# 文本获取键盘焦点
self.label.grabKeyboard()
# self.label.grabMouse()
# 移动标记
self.move_flag = None
# ***************************************
# 完成鼠标点击(左键)用户区域,实现窗口的拖拽
# 按下左键后,实现窗口左顶点 与 鼠标的顶点 同步
def mousePressEvent(self, event: QtGui.QMouseEvent):
# 按下的是否左键
if event.button() == Qt.MouseButton.LeftButton:
self.move_flag = True
# 窗口左顶点 初始位置
self.window_origin_x = self.x()
self.window_origin_y = self.y()
print("窗口初始位置:", self.window_origin_x, self.window_origin_y)
# 鼠标顶点初始位置
self.mouse_x = event.globalX()
self.mouse_y = event.globalY()
print("鼠标初始位置:", self.mouse_x, self.mouse_y)
def mouseMoveEvent(self, event: QtGui.QMouseEvent):
if self.move_flag:
# 获取鼠标移动后的偏移量
offset_x = event.globalX() - self.mouse_x
offset_y = event.globalY() - self.mouse_y
print("偏移量:", offset_x, offset_y)
# 窗口移动 偏移量
self.dest_x = self.window_origin_x + offset_x
self.dest_y = self.window_origin_y + offset_y
# 移动窗口
self.move(self.dest_x, self.dest_y)
def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
self.move_flag = False
# ***************************************
class MyLabel(QLabel):
# 重写事件函数
def keyPressEvent(self, evt: QKeyEvent):
print("键盘按下...")
# 判断按下的键
if evt.key() == Qt.Key.Key_A:
print("A 被按下")
# 加修饰按键 的 组合 Ctrl + S
elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier and evt.key() == Qt.Key.Key_S:
print("Ctrl + S 被按下")
# 多个修饰键
elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier \
and evt.key() == Qt.Key.Key_S:
print("Ctrl + Shift + S 被按下")
else:
print("其他按钮...")
if __name__ == '__main__':
# 窗口应用程序
app = QApplication(sys.argv)
window = Window()
window.show()
status_code = app.exec_()
sys.exit(status_code)
父子关系扩展
parent.childAt(x, y)
child.parentWidget()
parent.childrenRect() 父控件下所有的子控件组成的矩形区域
案例:
在一个窗口里设置多个QLabel子控件,点击某个QLabel 则为选中(cyan背景),再次点击则取消(white背景)。
# 重写QLabel的点击事件
class MyLabel(QLabel):
def __init__(self, *args, **kwargs):
super(MyLabel, self).__init__(*args, **kwargs)
self.flag = True
# QLabel的点击事件
def mousePressEvent(self, event: QtGui.QMouseEvent):
if self.flag:
self.setStyleSheet("background-color: cyan")
self.flag = False
else:
self.setStyleSheet("background-color: white")
self.flag = True
另外也可以重写父控件的点击事件(mousePressEvent)。
Z轴的层级关系
案例: 点击某个子控件,实现该子控件移动到最上层