【PyQt】PyQt学习(三)QWidget介绍

news2025/1/18 17:05:40

概述

在这里插入图片描述

QWidget 类是所有 Qt GUI 界面类的基类,是 PyQt 程序中的最小元素,也就是所有可现实的控件的基类。一个继承自 QWidget 的类可以在屏幕上绘制自身,这是因为 QWidget 继承了 QPaintDevice 类,该类用于将控件绘制在屏幕上。每一个可视控件都是矩形的且都按 Z 顺序排序,一个空间的显示会被自己的父类(指定的 parent)和其他控件进行阻挡。

未嵌入到窗口的可视控件称之为窗口,例如 QDialog 和 QMainWindow。

重要属性和功能

位置和大小

QWidget 类最重要的功能是提供了控件的显示,显示依赖于两个属性位置和大小,在 PyQt 框架中,控件坐标系统以左上角为原点,向右为 X 轴的正方向,向下为 Y 轴正方向建立。

每个控件都有一个边框,因此在高度、位置的设置和获取上,都有两种方式,即包含边框和不包含边框。

包含框架的位置获取方法:

  • x():获取相对于父控件的 X 位置(没有父控件则相对于桌面);
  • y():相对于父控件的 Y 位置(没有父控件则相对于桌面);
  • pos():x 和 y 的组合方法,返回QPoint对象。

不包含框架的位置获取方法:

  • geometry().x():获取相对于父控件的 X 位置;
  • geometry().y():获取相对于父控件的 Y 位置;
  • geometry():获取用户区域相对于父控件的位置和尺寸。

包含框架的大小获取方法:

  • frameGeometry().width():获取控件的宽度;
  • frameGeometry().height():获取控件的高度;
  • frameGeometry():获取控件尺寸。

不包含框架的大小获取方法:

  • width():获取控件的宽度;
  • height():获取控件的高度;
  • rect():获取控件宽高。

设置位置和大小

  • resize():设置控件的大小(不包含边框);
  • move():移动控件(包括框架);
  • setFixedSize():设置控件固定尺寸。

除了直接给定控件大小,还可以设置大小的上下限,相关方法介绍如下:

  • minimumwidth():获取最小宽度;
  • minimumheight():获取最小高度;
  • minimumsize():上面两个方法的结合;
  • maxmumwidth():获取最小宽度;
  • maxmumheight():获取最小高度;
  • maxmumsize():上面两个方法的结合方法。

控件层级

没有父窗口小部件的窗口小部件始终是一个独立窗口,对于这些控件,可以调用 setWindowTitle()setWindowIcon() 设置标题栏和图标。QWidget 类本身提供了这些方法,但是如果不是顶级控件,调用这些方法会失效。如下图所示,QGroupBox是父控件,其余的 QLabelQDateEdit 等控件都受它的管理。

在这里插入图片描述

子控件的生命周期和父控件一致,在创建任何一个控件的时候传递一个 QWidget 子类实例作为新创建的控件的父控件。例如 self.widget_2 = QtWidgets.QWidget(self.centralwidget),在 QWidget 类中提供了几个方法用于管理父子关系

  • childAt():获取在指定坐标位置的子控件;
  • parentWidget():获取指定控件的父控件;
  • childreanRect():获取所有子控件组成的边界矩形。

除了这种父子的层级关系,控件之间在 Z 轴上还有一种层级关系,QWidget 提供了一些方法用来管理这种关系:

  • lower():将控件放到最底层;
  • raise():将控件放到最上层;
  • a.stackunder(b):将 a 控件放到指定控件 b 之下。

绘制自定义控件

由于 QWidgetQPaintDevice 的子类,因此子类可使用 QPainter 类的实例使用一系列绘画操作,所以如果想要创建自己的控件,最好继承自 QWidget 类。

每一个控件都有一个 paintEvent() 方法,在这个函数中执行所有的绘制操作,每当需要重绘控件的时候都会调用该方法。一般的处理方案如下:

def paintEvent(self, a0: QPaintEvent) -> None:  
    ... # 自定义操作
    super(MainWindow, self).paintEvent(a0)

控件尺寸

除了直接指定大小、最大、最小长宽之外,QWidget 还提供了尺寸策略,这个主要用于在布局情况下,多个子控件之间的大小调整,尺寸策略的可选值如下:

在这里插入图片描述

默认情况下,顶级控件的大小被限制为桌面高度和宽度的 2 3 \frac{2}{3} 32

事件

在 PyQt 中控件和用户的交互一般通过事件,有一个消息队列不断接收程序产生的事件信息,并将其包装为QEvent对象进行分发处理。针对不同类型的QEvent对象,每个控件都有对应的处理函数,比方说 moveEvent() 用于处理窗口移动事件;enterEvent() 用于处理鼠标光标进入事件。

焦点和交互

控制状态就是获取焦点的状态,一个控件只有获取了焦点的控件才能进行交互,针对焦点,QWidget 提供了如下函数进行管理;

  • setFocus():指定控件获取焦点;
  • setFocusPolicy():设置获取焦点的策略;
  • focuswidget():获得子控件中当前聚焦的控件;
  • focusNextChild():聚焦下一个子控件;
  • setTabOrder():设置子控件获取焦点的顺序。

针对交互,QWdiget 也提供了相应的方法:

  • setEnabled():指定控件是否可用;
  • isEnabled():返回控件是否可用;
  • isvisible():代表了控件的最终状态,即使被其他控件遮挡也算看的见;
  • isHidden():代表该控件是否对父控件可见。

功能总结

ContextFunctions and Properties
窗口函数show() , hide() , raise() , lower() , close() .
顶级窗口函数windowModified , windowTitle , windowIcon , isActiveWindow , activateWindow() , minimized , showMinimized() , maximized , showMaximized() , fullScreen , showFullScreen() , showNormal() .
窗口内容update() , repaint() , scroll() .
位置pos , x() , y() , rect , size , width() , height() , move() , resize() , sizePolicy , sizeHint() , minimumSizeHint() , updateGeometry() , layout() , frameGeometry , geometry , childrenRect , childrenRegion , adjustSize() , mapFromGlobal() , mapToGlobal() , mapFromParent() , mapToParent() , maximumSize , minimumSize , sizeIncrement , baseSize , setFixedSize()
模式visible , isVisibleTo() , enabled , isEnabledTo() , modal , isWindow() , mouseTracking , updatesEnabled , visibleRegion() .
外观style() , setStyle() , styleSheet , cursor , font , palette , backgroundRole() , setBackgroundRole() , fontInfo() , fontMetrics() .
键盘和焦点focus , focusPolicy , setFocus() , clearFocus() , setTabOrder() , setFocusProxy() , focusNextChild() , focusPreviousChild() .
鼠标和键盘grabMouse() , releaseMouse() , grabKeyboard() , releaseKeyboard() , mouseGrabber() , keyboardGrabber() .
事件处理event() , mousePressEvent() , mouseReleaseEvent() , mouseDoubleClickEvent() , mouseMoveEvent() , keyPressEvent() , keyReleaseEvent() , focusInEvent() , focusOutEvent() , wheelEvent() , enterEvent() , leaveEvent() , paintEvent() , moveEvent() , resizeEvent() , closeEvent() , dragEnterEvent() , dragMoveEvent() , dragLeaveEvent() , dropEvent() , childEvent() , showEvent() , hideEvent() , customEvent() . changeEvent() ,
系统函数parentWidget() , window() , setParent() , winId() , find() , metric() .
菜单contextMenuPolicy , contextMenuEvent() , customContextMenuRequested() , actions()
交互提示setToolTip() , setWhatsThis()

往期回顾

  1. 【PyQt】PyQt学习(二)模块介绍+QObject学习
  2. 【PyQt】PyQt学习(一)框架介绍+环境搭建

文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!

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

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

相关文章

leecode每日一题 1054 距离相等的条形码

题目描述 在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 示例 1: 输入&#xf…

JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程

接上节课内容 JS逆向 -- 分析某站buvid3和_uuid的加密过程 JS逆向 -- 分析某站b_lsid值加密过程 一、清除cookie信息,刷新网页,ctrlf搜索sid,这样找到的数据是在url里或者响应信息里面,全局搜索找到的一般都是在js里面的数据&a…

ChatGPT生成Excel统计公式——检查数据是否满足要求

背景需求 有一张表格如下,需要统计每个用户是否在第一到第三周中,每周发文数量都大于等于两篇,是的话给出Yes,否的话给出No 操作流程 给出描述,让ChatGPT生成对应的公式,条件如下: 在excel中…

【保护和自动控制 JDX-1000信号继电器 机械保持、电复归 JOSEF约瑟】

名称:信号继电器;型号:JDX-1000系列;品牌:JOSEF约瑟;额定电压:110、220VDC/AC;起动电流:3mA;稳定电流:2A;功率消耗:不大于…

TH2822D手持式 LCR数字电桥产品资料

TH2822D是一款手持式LCR数字电桥,可测量电容、电感和电阻,具有高精度、高灵敏度、低功耗和易于携带等特点。TH2822D适用于生产、现场维修和科研等多个领域。 TH2822D手持式LCR数字电桥的主要特点如下:1. 标准源四终点测量方法,准…

【优秀!44个HCIA-Datacom知识点总结】

1、IPV4地址的组成部分?IP地址长度?表达形式?如何区分网络位和主机位? 组成部分:网络位主机位 IP地址长度:32bit 表达形式:点分十进制 区分:子网掩码区分,为1是网络位&am…

以云原生推动代际跃升,2023通明湖论坛云原生分论坛召开

5月12日,由神州数码主办,北京经开区国家信创园、中关村云计算产业联盟协办的2023通明湖论坛-云原生分论坛在京召开。本次论坛,以“抓住云原生机遇,推动我国信息基础设施技术代际跃升”为主题,聚焦以云原生为核心引领的…

vue2和elementUI 打造落日余晖登录页和滑块校验

文章目录 前言1 项目搭建2 依赖引入3 项目调整①vue-router② App.vue③ main.js 4 写登录页5 写滑块校验6 源码下载7 问题解决①项目一直报错② 背景图存在白边 前言 标题很夸张,实则是AI的功能,今天咱也搞一个登录页,其实满简单的一个东东…

Gigabayte-Z87-DS3H i3 4130电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件型号驱动情况 主板Gigabayte-Z87-DS3H 处理器英特尔酷睿i3 4130 Haswell已驱动 内存4x4GB DDR3/1600Mhz金士顿已驱动 硬盘SSD 480GB PNY CS900已驱动 显卡英特尔高…

想学透OSPF,先搞懂这6个技术点再说

大家好,我是老杨。 OSPF,这玩意儿作为目前主流的IGP协议,主要是为了解决RIP的三大问题而出现的。 应用面非常广,认可度也高,毕竟的确是好用的。 也有很多正在学习的小友想找我讲讲,OSPF该怎么学。 基础的…

Beerus:基于Helios light client的Starknet Stateless Client

1. 引言 前序博客: Helios——a16z crypto构建的去中心化以太坊轻节点 Beerus为基于Helios light client构建的Starknet Stateless Client,开源代码实现见: https://github.com/keep-starknet-strange/beerus(Rust&#xff09…

食饮品牌如何用Social Power抓住消费者心智?

2023 Foodaily创博会 2023.05.14-2023.05.16 数说故事将深度参与Foodaily创博会(第八届Foodaily FBIC全球食品饮料创新大会),和食饮品牌一起玩转Social Power,抓住消费者心智,用一种很新的方法营销与创新。 作为食饮…

Qt5.15.2替换mingw32-make.exe为emmake

qtcreator对qt程序的编译过程是先“qmake” ,然后“构建(等价于make)”。 qtcreator右键点击项目 出现的 “执行qmake”和“构建” 两个选项其实就是运行 项目-》build->构建步骤 中的“qmake”和“make”步骤所对应的命令行命令。 从项目…

类和对象(三)

目录 前言 1.再谈构造函数 1.1 初始化列表 1.2 explicit关键字 2.static成员 2.1 概念 2.2 特性 3.友元 3.1. 友元函数 3.2 友元类 4.内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 前言 今天小编给大家介绍的就是类最后的相关内容,希望大家好好学习理…

僵尸进程?孤儿进程?为什么他有如此惨烈的身世...

文章目录 💐专栏导读💐文章导读🌷认识进程状态🌺如何查看进程状态 🌷R状态🌺引例🌺如何观察 🌷S状态与D状态🌺S状态🍁如何观察 🌺D状态 &#x1f…

【机器学习】Yellowbrick 包的理解和说明

文章目录 一、介绍二、Visualizers2.1 Classification Visualization2.2 Clustering Visualization2.3 Feature Visualization2.4 Model Selection Visualization2.5 Regression Visualization2.6 Target Visualization2.7 Text Visualization 一、介绍 首先是包的安装过程&am…

Reid strong baseline 代码详解

本项目是对Reid strong baseline代码的详解。项目暂未加入目标检测部分,后期会不定时更新,请持续关注。 本相比Reid所用数据集为Markt1501,支持Resnet系列作为训练的baseline网络。训练采用表征学习度量学习的方式。 目录 训练参数 训练代…

前端开发之this.$options.data的使用

前端开发之this.$options.data的使用 前言效果图vue2中使用vue3中使用 前言 this.$options.data:初始化对象 效果图 vue2中使用 this.$options这是一个Vue的特性,它可以让你访问组件的选项对象。你可以使用this.$options.data.call(this)来获取组件的初始数据&am…

pytorch模型转ONNX

目录 1. ONNX 2. pytorch 转 ONNX 3. 加载 ONNX 文件 4. Netron 1. ONNX 一般来说,pytorch训练好的模型是不能够直接用于生产环境,有很多的地方没有优化 而ONNX 格式可以兼顾不同框架的模型,相当于一个中间人的角色。这样部署到不同的环…

msvcr120.dll丢失怎样修复,学这三招就可以修复好

年前才买的新电脑,今天在打开软件ps软件的时候,电脑就提升msvcr120.dll文件丢失,无法执行此代码。刚刚开始以为是电脑的系统没有装好,经过我一下午时间的研究,原来是电脑msvcr120.dll文件丢失一般都是下载到垃圾软件&a…