• GUI编程--PyQt5--QWidget


    QWidget简介

    1. 控件是用户界面的最小元素,是一个矩形局域。
    2. 没有父控件的控件为顶级控件,会装饰一个标题栏,成为一个窗口。父控件调用show()后,会注意遍历其下的子控件并展示。
    3. 子控件,会被父控件管理、裁剪。
    4. QWidget是所有可视化控件的基类,是一个空白控件,继承自QObject
    5. 所有控件按照Z轴排序

    在这里插入图片描述
    obj._bases_, 获取直接父类,是一个属性
    obj.mro() 获取继承链的父类
    obj._subclasses_() 获取子类, 是一个魔法方法

    功能作用

    控件的创建

    from PyQt5.QtWidgets import QLabel
    
    label = QLabel(parent, flags)
    
    # parent 父控件
    # 标志位  设置窗口的外观
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    坐标系统

    在这里插入图片描述
    窗口的左上角或者父控件的左上角为原点

    控件位置与大小

    obj.x(), 距离父控件或者屏幕左上角的x轴距离,包含边框
    obj.y(),距离父控件或者屏幕左上角的y轴距离,包含边框
    obj.pos(), x和y的组合,是QPoint(x,y) 的对象

    obj.width() 控件的宽度,不含边框
    obj.height() 控件的高度,不含边框
    obj.size() 宽高的组合,QSize(width, height) 的对象

    geometry, 用户区域(纯控件部分)相对于父控件或者屏幕的位置,是QRect(x,y, width, height) 的对象

    在这里插入图片描述

    在这里插入图片描述

    调整位置与尺寸

    在这里插入图片描述
    控件显示后,再设置位置和尺寸????

    # 根据内容,自适应大小
    label.adjustSize()
    # 设置固定大小, 无法变化
    label.setFixedSize(300, 400)
    
    • 1
    • 2
    • 3
    • 4

    布局案例:

    1. 创建一个窗口,width 500, height 500, 左边框距离300, 上边框距离300
    2. 让用户输入显示的子控件总数量,每一行显示的子控件数,实现九宫格展示所有的子控件
      在这里插入图片描述
      代码:
    # __author__ = "laufing"
    
    # 导包
    # from PyQt5.Qt import *   导入所有的类, 占用内存
    from PyQt5.QtWidgets import QApplication   # 应用控件
    from PyQt5.QtWidgets import QLabel
    from PyQt5.QtWidgets import QWidget
    from PyQt5.QtGui import QIcon
    from PyQt5.QtGui import QPixmap
    import sys
    
    
    
    if __name__ == '__main__':
    
        total_widget = int(input("输入总数:").strip())
        row_count = int(input("每行展示数:").strip())
        # 多少行
        row_ = total_widget/row_count if total_widget % row_count == 0 else total_widget // row_count + 1
    
        sub_col_width = 500 / row_count
        sub_row_height = 500 / row_
    
        # 1.创建应用程序
        app = QApplication(sys.argv)
        print("接收的命令行参数:", app.arguments())
        # print("全局的应用程序对象:", qApp)
    
        # 2. 控件操作
        window = QWidget()  # 窗口控件
        window.setWindowTitle("laufing")  # 窗口标题
        window.resize(500, 500)  # 调整窗口大小(用户区域)
        window.move(300, 300)  #  移动窗口位置(包含边框)
    
        # 创建控件对象,并放入 窗口控件
        # i控制行,j 控制列
        i,j = 0, 0
        #
        print("xxx total widget:", total_widget)
        for k in range(total_widget):
            print("xxxxx:", k)
            label = QLabel(window)  # 实例化一个标题控件,放入window窗口控件中
            label.setText("文本" + "%s, %s, %s"%(i, j, k))
            if j % 2 == 0:
                label.setStyleSheet("background-color: cyan; text-align: center;")
            else:
                label.setStyleSheet("background-color: pink")
    
            label.resize(sub_col_width, sub_row_height)
    
            label.move(j*sub_col_width, i*sub_row_height)
    
            j += 1
            if j == row_count:
                i += 1
                j = 0
    
    
        # logo 图标
        icon = QIcon()
        icon.addPixmap(QPixmap("./imgs/dog.jpg"), QIcon.Normal, QIcon.Off) # 添加Pixmap对象
        window.setWindowIcon(icon)
    
        # 显示
        window.show()
        # 3. app.exec_()  进入消息循环,保证程序一直运行
        exit_code = app.exec_()
        # 退出程序,并传入退出码
        sys.exit(exit_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

    最大、最小尺寸

    在这里插入图片描述
    在这里插入图片描述
    设置了最大尺寸后,手动和代码都无法逾越最大尺寸

    控件内容外边距

    obj.setContentsMargin(左,上,右,下)
    obj.getContentsMargin()
    obj.contentsRect() 内容区域

    实现如下效果:
    在这里插入图片描述

    设置鼠标的形状

    鼠标移动到某控件(区域)时,显示的形状。
    obj.setCursor(Qt.xxx)

    # 设置鼠标的样式
    from PyQt5.QtCore import Qt
    window.setCursor(Qt.CursorShape.CrossCursor)
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    自定义鼠标样式:

    from PyQt5.QtGui import QIcon, QPixmap, QCursor
    # 自定义鼠标的样式
    pix_map = QPixmap("./imgs/dog.jpg")
    # 缩放图片
    pix_map2 = pix_map.scaled(30, 30)  # 30 * 30
    # 实例化QCursor 对象
    q_cursor = QCursor(pix_map2) # 后面两个参数 hotX,hotY  鼠标的箭头点
    # 控件对象 设置鼠标样式
    window.setCursor(q_cursor)
    
    # 取消设置
    window.unsetCursor()
    
    # 控件获取鼠标对象
    current_cursor = window.cursor()  # QCursor对象
    
    # 设置鼠标的位置
    current_cursor.setPos(0, 0)
    # 打印鼠标的位置
    print(current_cursor.pos())
    
    current_cursor.pixmap()  # 获取鼠标图片
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    鼠标跟踪

    在这里插入图片描述
    自定义控件类,并重写mouseMoveEvent

    class MyWindow(QWidget):
        # 鼠标移动事件
        def mouseMoveEvent(self, mouseEvent: QMouseEvent):
            print("全局位置(屏幕位置)...", mouseEvent.globalPos())
            print("局部位置(窗口位置)...", mouseEvent.localPos())
            print("屏幕位置(全局位置)...", mouseEvent.screenPos())
            print("窗口位置(布局位置)...", mouseEvent.windowPos())
            print("button...", mouseEvent.button())
            print("buttons...", mouseEvent.buttons())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里设置鼠标移动的跟踪,则鼠标移动就触发上述事件

    # 控件内部设置鼠标跟踪,触发mouseMoveEvent
    window.setMouseTracking(True)
    window.setMouseTracking(False)
    
    • 1
    • 2
    • 3

    案例: 创建一个窗口,内部实现一个QLabel控件,当鼠标移入窗口后,让QLabel控件随着鼠标的位置而移动位置

    # __author__ = "laufing"
    
    from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QLabel
    from PyQt5 import QtGui
    
    
    class MyWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("laufing")
            # 实例化图片对象
            pixmap = QtGui.QPixmap("./imgs/dog.jpg").scaled(50, 50)
            # 实例化图标对象
            icon = QtGui.QIcon()
            icon.addPixmap(pixmap, QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.setWindowIcon(icon)
    
            # 设置窗口内容宽高
            self.resize(500, 500)
    
            # 窗口居中
            desktop_geo = QDesktopWidget().geometry()
            screen_width, screen_height = desktop_geo.width(), desktop_geo.height()
            self.move(screen_width/2 - self.width()/2, screen_height/2 - self.height()/2)
    
            # 设置鼠标 追踪
            self.setMouseTracking(True)
    
            # 设置QLabel控件对象
            self.label = QLabel(self)
            self.label.setText("测试鼠标追踪")
            self.label.setStyleSheet("background-color: pink;")
            self.label.resize(100, 50)
            self.label.move(10, 10)
    
        def mouseMoveEvent(self, a0: QtGui.QMouseEvent):
            print("鼠标移动.....")
            x,y = a0.localPos().x(), a0.localPos().y()
    
            self.label.move(x, y)
    
    
    if __name__ == '__main__':
        import sys
        app = QApplication(sys.argv)
    
        window = MyWindow()
    
        window.show()
    
    
        exit_code = app.exec_()
        sys.exit(exit_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

    在这里插入图片描述

  • 相关阅读:
    ATA-8061射频功率放大器在心室导管式扩压电式测力传感器中的应用
    day51: QTday4,绘制事件、QT连接TCP网络通信
    Jetpack系列 -- ViewBinding应用
    博客系统前端页面
    tomcat、nginx实现四层转发+七层代理+动静分离实验
    陪诊小程序的市场潜力与发展趋势研究
    Python中print函数的八重境界
    Redis 命令 和 数据类型 您知道多少
    自动驾驶算法逻辑框架中的三层特性——“多”重,“自”主,“深”化演进
    JavaScript(四):遇见Promise
  • 原文地址:https://blog.csdn.net/weixin_45228198/article/details/127883328