自定义控件类(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 sysclass 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 + Selif 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 sysclass 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_xoffset_y = event.globalY() - self.mouse_yprint("偏移量:", offset_x, offset_y)# 窗口移动 偏移量self.dest_x = self.window_origin_x + offset_xself.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 + Selif 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 = Falseelse:self.setStyleSheet("background-color: white")self.flag = True
另外也可以重写父控件的点击事件(mousePressEvent)。

案例: 点击某个子控件,实现该子控件移动到最上层