• GUI编程--PyQt5--QWidget2


    事件

    自定义控件类(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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    案例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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112

    父子关系扩展

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    另外也可以重写父控件的点击事件(mousePressEvent)。

    Z轴的层级关系

    在这里插入图片描述
    案例: 点击某个子控件,实现该子控件移动到最上层

  • 相关阅读:
    网络安全(黑客)自学
    一张图进阶 RocketMQ - 消息存储
    如何低成本的玩转独立站
    SQL语句练习
    微信营销软件可靠吗?
    嵌入式开发:清理可重用软件的API
    【C++】Qt的属性系统,简单示例
    PID算法数学原理
    Docker部署RocketMq4.7
    衡量模块独立性的两个标准是什么?各表示什么含义?
  • 原文地址:https://blog.csdn.net/weixin_45228198/article/details/127902800