【Qt】控件的核心属性

server/2024/9/23 8:29:38/

1 🍑控件概述🍑

WidgetQt 中的核⼼概念. 英⽂原义是 “⼩部件”, 我们此处也把它翻译为 “控件” .控件是构成⼀个图形化界⾯的基本要素。

Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件。这⼀点在 Qt Designer 中就可以看到端倪,并且 Qt 也提供了 “⾃定义控件” 的能⼒, 可以让程序猿在现有控件不能满⾜需求的时候, 对现有控件做出扩展, 或者⼿搓出新的控件


2 🍑QWidget 核心属性🍑

Qt 中, 使⽤ QWidget 类表⽰ “控件”。像按钮、视图、输⼊框、滚动条等具体的控件类, 都是继承⾃QWidget
可以说, QWidget 中就包含了 Qt 整个控件体系中通⽤的部分,在 Qt Designer 中, 随便拖⼀个控件过来, 选中该控件, 即可在右下⽅看到 QWidget 中的属性。

这些属性既可以通过 QtDesigner 会直接修改, 也可以通过代码的⽅式修改。

2.1 🍎核心属性概览🍎

下列表格列出了 QWidget 中的属性及其作⽤:

属性作⽤
enabled设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤
geometry位置和尺⼨,包含 x, y, width, height 四个部分。其中坐标是以⽗元素为参考进⾏设置的。
windowTitle设置 widget 标题
windowIcon设置 widget 图标
windowOpacity设置 widget 透明度
cursor⿏标悬停时显⽰的图标形状,是普通箭头,、还是沙漏、还是⼗字等形状,在 Qt Designer 界⾯中可以清楚看到可选项。
font字体相关属性,涉及到字体家族、字体⼤⼩、粗体、斜体、下划线等等样式。
toolTip⿏标悬停在 widget 上会在状态栏中显⽰的提⽰信息。
toolTipDuringtoolTip 显⽰的持续时间。
statusTipWidget 状态发⽣改变时显⽰的提⽰信息(⽐如按钮被按下等)。
whatsThis⿏标悬停并按下 alt+F1 时, 显⽰的帮助信息(显⽰在⼀个弹出的窗⼝中)。
styleSheet允许使⽤ CSS 来设置 widget 中的样式,Qt 中⽀持的样式⾮常丰富, 对于前端开发⼈员上⼿是⾮常友好的。
focusPolicy该 widget 如何获取到焦点:Qt::NoFocus:控件不参与焦点管理,即⽆法通过键盘或⿏标获取焦点;Qt::TabFocus:控件可以通过Tab键获得焦点;Qt::ClickFocus:控件可以通过⿏标点击获得焦点;Qt::StrongFocus:控件可以通过键盘和⿏标获得焦点;Qt::WheelFocus:控件可以通过⿏标滚轮获得焦点(在某些平台或样式中可能不可⽤)。
contextMenuPolicy上下⽂菜单的显⽰策略:Qt::DefaultContextMenu:默认的上下⽂菜单策略,⽤⼾可以通过⿏标右键或键盘快捷键触发上下⽂菜单;Qt::NoContextMenu:禁⽤上下⽂菜单,即使⽤⼾点击⿏标右键也不会显⽰菜单;Qt::PreventContextMenu:防⽌控件显⽰上下⽂菜单,即使⽤⼾点击⿏标右键也不会显⽰菜单;Qt::ActionsContextMenu:将上下⽂菜单替换为控件的“动作”菜单,⽤⼾可以通过⿏标右键或键盘快捷键触发这个菜单,Qt::CustomContextMenu:使⽤⾃定义的上下⽂菜单,⽤⼾可以通过⿏标右键或键盘快捷键触发这个菜单。
locale设置语⾔和国家地区。
acceptDrops该部件是否接受拖放操作。如果设置为true,那么该部件就可以接收来⾃其他部件的拖放操作。当⼀个部件被拖放到该部件上时,该部件会接收到相应的拖放事件(如dropEvent)。如果设置为false,那么该部件将不会接收任何拖放操作。
minimumSize控件的最⼩尺⼨. 包含最⼩宽度和最⼩⾼度
maximumSize控件的最⼤尺⼨. 包含最⼤宽度和最⼤⾼度
sizePolicy尺⼨策略,设置控件在布局管理器中的缩放⽅式
windowModality指定窗⼝是否具有 “模态” ⾏为
sizeIncrement拖动窗⼝⼤⼩时的增量单位
baseSize窗⼝的基础⼤⼩, ⽤来搭配 sizeIncrement 调整组件尺⼨是计算组件应该调整到的合适的值。
palette调⾊板. 可以设置 widget 的颜⾊⻛格
mouseTracking是否要跟踪⿏标移动事件。如果设为 true, 表⽰需要跟踪, 则⿏标划过的时候该 widget 就能持续收到⿏标移动事件,如果设为 false, 表⽰不需要跟踪, 则⿏标划过的时候 widget 不会收到⿏标移动事件, 只能收到⿏标按下或者释放的事件。
tabletTracking是否跟踪触摸屏的移动事件,类似于 mouseTracking . Qt 5.9 中引⼊的新属性。
layoutDirection布局⽅向:Qt::LeftToRight:⽂本从左到右排列,也是默认值;Qt::RightToLeft:⽂本从右到左排列;Qt::GlobalAtomics:部件的布局⽅向由全局原⼦性决定(PS 这个翻译其实有点尴尬,其实就是根据应⽤程序中的其他 widget 布局⽅向确定的)
autoFillBackground是否⾃动填充背景颜⾊
windowFilePath能够把 widget 和⼀个本地⽂件路径关联起来. PS: 其实作⽤不⼤
accessibleName设置 widget 的可访问名称. 这个名称可以被辅助技术 (像屏幕阅读器) 获取到
accessibleDescription设置 widget 的详细描述. 作⽤同 accessibleName
inputMethodHints针对输⼊框有效, ⽤来提⽰⽤⼾当前能输⼊的合法数据的格式. ⽐如只能输⼊数字, 只能输⼊⽇期等。

接下来我们会介绍其中⼀些⽐较重要⽐较常⽤的属性。

2.2 🍎enabled🍎

API说明
isEnabled()获取到控件的可⽤状态
setEnabled设置控件是否可使⽤,true 表⽰可⽤, false 表⽰禁⽤

🎨 所谓 “禁⽤” 指的是该控件不能接收任何⽤⼾的输⼊事件, 并且外观上往往是灰⾊的,如果⼀个 widget 被禁⽤, 则该 widget 的⼦元素也被禁⽤。

代码⽰例: 通过按钮2 切换按钮1 的禁⽤状态:
在这里插入图片描述

2.3 🍎geometry🍎

位置和尺⼨,其实是四个属性的统称:

  • x 横坐标
  • y 纵坐标
  • width 宽度
  • height ⾼度

在这里插入图片描述
但是实际开发中, 我们并不会直接使⽤这⼏个属性, ⽽是通过⼀系列封装的⽅法来获取/修改:

API说明
geometry()获取到控件的位置和尺⼨,返回结果是⼀个 QRect, 包含了 x、y、width、height,其中 x, y 是左上⻆的坐标
setGeometry(QRect)设置控件的位置和尺⼨,可以直接设置⼀个 QRect, 也可以分四个属性单独设置
setGeometry(int x, int y, int width, int height)设置控件的位置和尺⼨,可以直接设置⼀个 QRect, 也可以分四个属性单独设置

我们来试试:
在这里插入图片描述运⾏程序可以看到, 按下下⽅的四个按钮, 就会控制 target 的左上⻆的位置. 对应的按钮整个尺⼨也会发⽣改变。

上述代码中我们是直接设置的 QRect 中的 x, y ,实际上 QRect 内部是存储了左上和右下两个点的坐标, 再通过这两个点的坐标差值计算⻓宽,单纯修改左上坐标就会引起整个矩形的⻓宽发⽣改变。

🏝 window frame 的影响

如果 widget 作为⼀个窗⼝ (带有标题栏, 最⼩化, 最⼤化, 关闭按钮), 那么在计算尺⼨和坐标的时候就有两种算法。包含 window frame 和 不包含 window frame。其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的⽅式来计算的。其中 geometry(), width(), height(), rect(), size() 则是按照不包含 window frame 的⽅式来计算的,当然, 如果⼀个不是作为窗⼝的 widget , 上述两类⽅式得到的结果是⼀致的。

在这里插入图片描述
相关 API:

API说明
x()获取横坐标,计算时包含 window frame
y()获取纵坐标,计算时包含 window frame
pos()返回 QPoint 对象, ⾥⾯包含 x(), y(), setX(), setY() 等⽅法,计算时包含 window frame
frameSize()返回 QSize 对象, ⾥⾯包含 width(), height(), setWidth(), setHeight() 等⽅法,计算时包含 window frame
frameGeometry()返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x, y,width, size,计算时包含 window frame 对象
width()获取宽度,计算时不包含 window frame
height()获取⾼度,计算时不包含 window frame
size()返回 QSize 对象, ⾥⾯包含 width(), height(), setWidth(), setHeight() 等⽅法,计算时不包含 window frame
rect()返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取并设置 x,y, width, size,计算时不包含 window frame 对象
geometry()返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x, y,width, size,计算时不包含 window frame 对象
setGeometry()直接设置窗⼝的位置和尺⼨. 可以设置 x, y, width, height, 或者 QRect 对象,计算时不包含 window frame 对象

我们写代码来感受一下他们的区别:
在这里插入图片描述

当执行时:
在这里插入图片描述
发现第一次执行结果是相同的,而第二次的执行结果是不同的。这是为什么呢?

在构造⽅法中,Widget 刚刚创建出来, 还没有加⼊到对象树中,此时也就不具备 Window frame,在按钮的 slot 函数中, 由于⽤⼾点击的时候, 对象树已经构造好了, 此时 Widget 已经具备了Window frame, 因此在位置和尺⼨上均出现了差异。如果把上述代码修改成打印 pushButtongeometryframeGeometry , 结果就是完全相同的, 因为 pushButton 并⾮是⼀个窗⼝。

2.4 🍎windowTitle🍎

API说明
windowTitle()获取到控件的窗⼝标题
setWindowTitle(const QString& title)设置控件的窗⼝标题

注意! 上述设置操作针对不同的 widget 可能会有不同的⾏为,如果是顶层 widget (独⽴窗⼝), 这个操作才会有效。

2.5 🍎windowIcon🍎

API说明
windowIcon()获取到控件的窗⼝图标. 返回 QIcon 对象
setWindowIcon(const QIcon& icon)设置控件的窗⼝图标

🎹 同 windowTitle, 上述操作仅针对顶层 widget 有效

实际开发中, 我们⼀般不会在代码中通过绝对路径引⼊图⽚. 因为我们⽆法保证程序发布后, ⽤⼾的电脑上也有同样的路径。如果使⽤相对路径, 则需要确保代码中的相对路径写法和图⽚实际所在的路径匹配 (⽐如代码中写作 “./image/rose.jpg”, 就需要在当前⼯作⽬录中创建 image ⽬录, 并把 rose.jpg 放进去)

Qt 使⽤ qrc 机制更⽅便的来管理项⽬依赖的静态资源。

qrc ⽂件是⼀种XML格式的资源配置⽂件, 它⽤XML记录硬盘上的⽂件和对应的随意指定的资源名称。应⽤程序通过资源名称来访问这些资源。在Qt开发中, 可以通过将资源⽂件添加到项⽬中来⽅便地访问和管理这些资源. 这些资源⽂件可以位于qrc⽂件所在⽬录的同级或其⼦⽬录下。

在构建程序的过程中, Qt 会把资源⽂件的⼆进制数据转成 cpp 代码, 编译到 exe 中,从⽽使依赖的资源变得 “路径⽆关”。这种资源管理机制并⾮ Qt 独有, 很多开发框架都有类似的机制。例如 Android 的 Resources和 AssetManager 也是类似的效果。

接下来我们使用QtCreator来创建一个qrc ⽂件:

  • 1️⃣右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂)
    在这里插入图片描述

  • 2️⃣ 在 qrc 编辑器中, 添加前缀
    在这里插入图片描述
    此处我们前缀设置成 / 即可,所谓的前缀, 可以理解成 “⽬录” ,这个前缀决定了后续我们如何在代码中访问资源。

  • 3️⃣在 资源编辑器 中, 点击 add Files 添加资源⽂件,此处我们需要添加的是 rabbit.png
    在这里插入图片描述
    添加完毕后, 可以在 资源编辑器 中看到添加好的⽂件:
    在这里插入图片描述

  • 4️⃣在代码中使⽤ rose.jpg
    在这里插入图片描述

注意上述路径的访问规则:

  • 使⽤ : 作为开头, 表⽰从 qrc 中读取资源;
  • / 是上⾯配置的前缀;
  • rabbit.png 是资源的名称;

需要确保代码中编写的路径和添加到 qrc 中资源的路径匹配,否则资源⽆法被访问 (同时也不会有报错提⽰)

  • 5️⃣运⾏程序, 可以看到图标已经能正确设置
    在这里插入图片描述

接下来, 我们可以进⼊到项⽬的构建⽬录, 可以看到, ⽬录中多了⼀个 qrc_resource.cpp ⽂件,直接打开这个⽂件, 可以看到类似如下代码:
在这里插入图片描述
在这里插入图片描述

上述代码其实就是通过 unsigned char 数组, 把 rabbit.png 中的每个字节都记录下来,这些代码会被编译到 exe 中,后续⽆论 exe 被复制到哪个⽬录下, 都确保能够访问到该图⽚资源。

上述 qrc 这⼀套资源管理⽅案, 优点和缺点都很明显:

  • 优点: 确保了图⽚, 字体, 声⾳等资源能够真正做到 “⽬录⽆关”, ⽆论如何都不会出现资源丢失的情况。
  • 缺点: 不适合管理体积⼤的资源,如果资源⽐较⼤ (⽐如是⼏个 MB 的⽂件), 或者资源特别多,⽣成的最终的 exe 体积就会⽐较⼤, 程序运⾏消耗的内存也会增⼤,程序编译的时间也会显著增加。

2.6 🍎windowOpacity🍎

API说明
windowOpacity()获取到控件的不透明数值,返回 float, 取值(0.0~1.0) 其中 0.0 表⽰全透明, 1.0 表⽰完全不透明
setWindowOpacity(float n)设置控件的不透明数值

这个很简单,就不再过多演示了。

2.7 🍎cursor🍎

API说明
cursor()获取到当前 widget 的 cursor 属性, 返回 QCursor 对象.当⿏标悬停在该 widget 上时, 就会显⽰出对应的形状
setCursor(const QCursor& cursor)设置该 widget 光标的形状. 仅在⿏标停留在该 widget 上时⽣效
QGuiApplication::setOverrideCursor(const QCursor& cursor)设置全局光标的形状. 对整个程序中的所有 widget 都会⽣效,覆盖上⾯的 setCursor 设置的内容

我们先创建一个按钮,然后在右侧的编辑框里面找到cursor这个选项:
在这里插入图片描述
当我们将鼠标移动到按钮那里的时候就会显示我们设置的是哪一种形状。
出了系统默认带的形状外,我们还可以自定义的设置,方式还是使用的是qrc机制:
在这里插入图片描述

2.8 🍎font🍎

API说明
font()获取当前 widget 的字体信息,返回 QFont 对象
setFont(const QFont& font)设置当前 widget 的字体信息

关于 QFont:

属性说明
family字体家族 ⽐如 “楷体”, “宋体”, “微软雅⿊” 等
pointSize字体⼤⼩
weight字体粗细. 以数值⽅式表⽰粗细程度取值范围为 [0, 99], 数值越⼤, 越粗
bold是否加粗. 设置为 true, 相当于 weight 为 75. 设置为 false 相当于weight 为 50
italic是否倾斜
underline是否带有下划线
strikeOut是否带有删除线

这个设置我们可以使用代码的方式也可以使用可视化的方式进行。

2.9 🍎toolTip🍎

API说明
setToolTip设置 toolTip,⿏标悬停在该 widget 上时会有提⽰说明
setToolTipDuring设置 toolTip 提⽰的时间(单位 ms),时间到后 toolTip ⾃动消失

toolTip 只是给⽤⼾看的,在代码中⼀般不需要获取到 toolTip

示例:
在这里插入图片描述

在这里插入图片描述

2.10 🍎focusPolicy🍎

设置控件获取到焦点的策略,⽐如某个控件能否⽤⿏标选中或者能否通过 tab 键选中。

所谓 “焦点” , 指的就是能选中这个元素,接下来的操作 (⽐如键盘操作), 就都是针对该焦点元素进⾏的了,这个对于 输⼊框, 单选框,复选框等控件⾮常有⽤的。

API说明
focusPolicy()获取该 widget 的 focusPolicy, 返回 Qt::FocusPolicy
setFocusPolicy(Qt::FocusPolicy policy)设置 widget 的 focusPolicy

Qt::FocusPolicy 是⼀个枚举类型,取值如下:

  • Qt::NoFocus控件不会接收键盘焦点
  • Qt::TabFocus控件可以通过Tab键接收焦点
  • Qt::ClickFocus控件在⿏标点击时接收焦点
  • Qt::StrongFocus控件可以通过Tab键和⿏标点击接收焦点 (默认值)
  • Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过⿏标滚轮获取到焦点 (新增的选项, ⼀般很少使⽤)

2.11 🍎styleSheet🍎

通过 CSS 设置 widget 的样式。

CSS (Cascading Style Sheets 层叠样式表) 本⾝属于⽹⻚前端技术,主要就是⽤来描述界⾯的样式,所谓 “样式”, 包括不限于 ⼤⼩, 位置, 颜⾊, 间距, 字体, 背景, 边框等。我们平时看到的丰富多彩的⽹⻚, 就都会⽤到⼤量的 CSS,Qt 虽然是做 GUI 开发, 但实际上和 ⽹⻚前端 有很多异曲同⼯之处. 因此 Qt 也引⼊了对于 CSS的⽀持。

CSS 中可以设置的样式属性⾮常多,基于这些属性 Qt 只能⽀持其中⼀部分, 称为 QSS (Qt Style Sheet)具体的⽀持情况可以参考 Qt ⽂档中 “Qt Style Sheets Reference” 章节。


http://www.ppmy.cn/server/22604.html

相关文章

Jmeter05:配置环境变量

1 Jmeter 环境 1.1 什么是环境变量?path什么用? 系统设置之一,通过设置PATH,可以让程序在DOS命令行直接启动 1.2 path怎么用 如果想让一个程序可以在DOS直接启动,需要将该程序目录配置进PATH 1.3 PATH和我们的关系…

DIY高考倒计时小软件python实现

目录 一.前言 二.完整代码 三.代码分析 一.前言 高考倒计时是指从当前日期到高考日期之间的天数倒计时。高考是指中国的普通高等学校招生全国统一考试,是中国教育系统中最为重要和决定性的考试之一。在高考前,学生和家长通常会关注离高考还有多少天,以便合理安排备考时间…

OceanBase 分布式数据库【信创/国产化】- OceanBase 集群配置项

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 集群配置项前言OceanBase 数据更新架构OceanBase 集群配置项OceanBase 配置项级别配置项的生效方式查看配置项的级别和生效方式OceanBase 分布式数据库【信创/国产化】- OceanBase 集群配置项…

mybatis-plus 基本使用

1. 引入依赖 首先&#xff0c;pom.xml 中添加MyBatis-Plus的依赖 <!-- Maven中的依赖示例 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>版本</versi…

Mysql课堂实训报告

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1、查询某同学的各科成绩2、查询需要参加补考的学生名单3、查询某课程成绩最好的学生姓名4、查询每位同学的成绩平均分5、查询学生的选课信息&#xff0c;要求显…

为“风”转“液”加速,一台宁畅服务器的“全液冷”突围

当节能减排成为全球性的时代议题&#xff0c;数据中心也正在经历一场从传统风冷向液冷&#xff08;水冷&#xff09;过渡的变迁。 但“水进风退”的过程无法一蹴而就。数据中心想通过液冷达到极致能效&#xff0c;同时成本可控&#xff0c;还要解决一系列的产业化、工程化、产品…

【c++】【贪心】排队接水

排队接水 题目难度&#xff1a;中阶 时间限制&#xff1a;1000ms 内存限制&#xff1a;128MB 题目描述 有 n 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 Ti&#xff0c;请编程找出这 n 个人排队的一种顺序&#xff0c;使得 n 个人的平均等待接水时间最…

【机器学习】概率模型在机器学习中的应用:以朴素贝叶斯分类去为例

概率模型在机器学习中的应用&#xff1a;以朴素贝叶斯分类器为例 一、概率模型的基本原理二、朴素贝叶斯分类器的原理与实现三、朴素贝叶斯分类器的应用与挑战四、结论与展望 在大数据与人工智能时代&#xff0c;概率模型在各个领域发挥着至关重要的作用。概率模型以概率论和统…