GUI编程--PyQt5--QWidget

文章目录

  • QWidget简介
  • 功能作用
    • 控件的创建
    • 坐标系统
    • 控件位置与大小
    • 调整位置与尺寸
  • 最大、最小尺寸
  • 控件内容外边距
  • 设置鼠标的形状
  • 鼠标跟踪

QWidget简介

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

GUI编程--PyQt5--QWidget_第1张图片
obj._bases_, 获取直接父类,是一个属性
obj.mro() 获取继承链的父类
obj._subclasses_() 获取子类, 是一个魔法方法

功能作用

控件的创建

from PyQt5.QtWidgets import QLabel

label = QLabel(parent, flags)

# parent 父控件
# 标志位  设置窗口的外观

坐标系统

GUI编程--PyQt5--QWidget_第2张图片
窗口的左上角或者父控件的左上角为原点

控件位置与大小

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) 的对象

GUI编程--PyQt5--QWidget_第3张图片

GUI编程--PyQt5--QWidget_第4张图片

调整位置与尺寸

GUI编程--PyQt5--QWidget_第5张图片
控件显示后,再设置位置和尺寸????

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

布局案例:

  1. 创建一个窗口,width 500, height 500, 左边框距离300, 上边框距离300
  2. 让用户输入显示的子控件总数量,每一行显示的子控件数,实现九宫格展示所有的子控件
    GUI编程--PyQt5--QWidget_第6张图片
    代码:
# __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)




最大、最小尺寸

GUI编程--PyQt5--QWidget_第7张图片
GUI编程--PyQt5--QWidget_第8张图片
设置了最大尺寸后,手动和代码都无法逾越最大尺寸

控件内容外边距

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

实现如下效果:
GUI编程--PyQt5--QWidget_第9张图片

设置鼠标的形状

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

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

GUI编程--PyQt5--QWidget_第10张图片
GUI编程--PyQt5--QWidget_第11张图片
GUI编程--PyQt5--QWidget_第12张图片
自定义鼠标样式:

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()  # 获取鼠标图片

鼠标跟踪

GUI编程--PyQt5--QWidget_第13张图片
自定义控件类,并重写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())

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

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

案例: 创建一个窗口,内部实现一个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)

GUI编程--PyQt5--QWidget_第14张图片

你可能感兴趣的:(python,GUI,qt,开发语言)