GUI编程--PyQt5--QWidget

news2025/1/16 14:02:17

文章目录

  • 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 父控件
# 标志位  设置窗口的外观

坐标系统

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

控件位置与大小

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. 创建一个窗口,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)




最大、最小尺寸

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

控件内容外边距

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

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

设置鼠标的形状

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

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

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

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

鼠标跟踪

在这里插入图片描述
自定义控件类,并重写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)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7源码安装 lldpd 并附查询脚本

文章目录源码安装 lldpd查询交换机端口的 lldpd 脚本查询交换机端口的 lldpad 脚本关于CentOS7上配置LLDP的文章,网络上已经很多了。实现交换机端口的抓取,众多周知的有两种工具,一种是lldpad,另一种是lldpd。 源码安装 lldpd 在…

get_post (攻防世界)(简单php)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 进入网址 解题工具: 需要使用hackerbar (也可以用burpsuite) 问题解析: 科普时间又到 GET方法 用来向服务器请求数据。 是常见的HTTP方法之一。 查询字符是在URL中发送的: /…

led台灯哪个牌子质量好?2022最新的台灯牌子排名

众所周知,现在绝大部分台灯都是使用led灯珠作为发光源,led台灯作为主流的选择,在光线舒适度、光线调控性、台灯售价、显色与防护、节能环保等方面都是非常出色的,远超以前的传统白炽灯。那么现在市面上led台灯这么多,选…

甬矽电子在科创板上市:市值达到122亿元,王顺波为实际控制人

11月16日,甬矽电子(宁波)股份有限公司(下称“甬矽电子”,SH:688362)在科创板上市。本次在科创板上市,甬矽电子发行6000万股,发行价格为18.54元/股,募资总额为11.24亿元。…

java单例模式

单例设计模式:Spring中的Bean默认都是单例的。 概念 全世界就只要一个---在整个java程序中,只有这个类的一个实例 比如Student a new Student(); 就是Student类只创建这一个实例,只能有这一个对象存在 主要解决:一个全局使用的类频繁地创…

人工蜂群优化及其在资源管理中的应用(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

单钩点弹珠/片经验总结

开锁的方向:不要管主驾驶室在车子的左边还是右边,记住朝车头开启就可以。 开锁技巧:我们将HU101工具插入锁孔以后,摆好姿势,先拨动撬杆试探性的去点击弹片,一般我们会发现锁芯里面的弹片主要是下面一些排列…

Mysql系列三:Innodb MVCC版本控制

文章目录一、Innodb MVCC版本控制1、什么是MVCC版本控制?2、Innodb MVCC 核心3、事物版本号、隐藏列、undo log日志的协调工作机制4、Read view5、举例讲解MVCC流程6、InnoDB 引擎不同隔离级别MVCC的区别7、MVCC是否解决了幻读的问题一、Innodb MVCC版本控制 1、什…

项目实战 Java读取Excel数据

项目实战 Java读取Excel数据前言实现步骤导入POI依赖示例Excel表结构编写读取Excel工具类实现思路读取Excel数据工具类实现代码取出从excel中获取的数据,并插入到数据库中总结如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!…

jQuery复习

jQuery:是一个js函数库,口号写少 做多 write less do more 封装简化DOM操作(增删改查)/ajax 为什么使用:强大的选择器:方便快速查找DOM元素 隐式遍历:一次监听多个 读写合一:读数据&…

DEFORMABLE DETR学习笔记

DEFORMABLE DETR学习笔记 DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION ABSTRACT DETR最近被提出,以消除在目标检测中需要许多手工设计的组件,同时展示良好的性能。但由于Transformer注意模块在处理图像特征映射时的局…

基于51单片机驱动A4988实现步进电机逆时针转动

基于51单片机驱动A4988实现步进电机逆时针转动一、简介二、接线典型接线图实际接线三、部分代码引脚定义定时器初始化主函数四、实验现象五、注意事项一、简介 A4988 是一款完全的微步电动机驱动器,带有内置转换器,易于操作。该产 品可在全、半、1/4、1…

Synchronized 与 Lock 的使用

Synchronized的使用 以卖票为例 //基本的卖票例子/*真正的多线程开发,公司中的开发,降低耦合性线程就是一个单独的资源类,没有任何附属的操作1.属性、方法*/ public class SaleTicketDemo01 {public static void main(String[] args) {//多个线程操作同…

python 可视化解释模型

1. 自定义DataSet MakeDataset.py 首先准备好一个数据集文件,这里以mydata文件夹存放图片数据, 实现自定义DataSet class MyDataset(Dataset):def __init__(self,resize):super(MyDataset,self).__init__()self.resize resizedef __len__(self):retur…

【软件分析第13讲-学习笔记】符号执行 Symbolic Execution

文章目录前言正文符号执行基于霍尔逻辑的符号执行谓词转换计算最弱前置条件动态符号执行符号执行:进一步探究小结参考文献前言 创作开始时间:2022年11月16日18:46:31 如题,学习一下符号执行 Symbolic Execution的相关知识。参考&#xff1a…

计算机毕业设计jsp家校互动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 家校互动系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用jav…

Linux用户操作(22.9.21)

学习目标: 用户账号管理Linux用户操作Linux用户组操作(一)用户账号管理 1、用户与用户组文件 在Linux系统当中,默认情况下所有用户信息保存在 /etc/passwd文件内,用户密码信息保存在/etc/shadow文件内;所…

43、Spring AMQP TopicExchange

1、TopicExchange 2、案例 3、通过配置类实现 1、配置TopicConfig 2、添加Listener 3、测试结果 4、通过注解实现 1、配置Linstener 2、测试结果 5、总结分析 学到这里,关于RabbitMQ的五种消息模型就结束了。 1、第一种消息模型:单个队列&#xff0c…

相机模型总结

目录相机模型前言1. pinhole 针孔模型2. Omnidirectional Camera Model 全向相机模型2.1 Unified model for catadioptric cameras 反射式相机统一模型2.2 Extended Unified model for catadioptric cameras (EUCM)2.3 Omnidirectional Camera Model By Scaramuzza畸变模型1. E…

linux篇【10】:进程信号

目录 一.信号入门 1.信号是操作系统内一个内置机制 2.前后台进程的几条命令与ctrlc 3.信号分类 4.信号产生是异步的 5.进程是如何记住这个信号 (3)存储方式:位图 二.signal ——对某信号设置自定义行为(捕捉)的函数 (1&a…