QWidget核心属性(一)

本文介绍了QT中的QWidget控件及其核心属性,包括控件概述、发展历史,重点讲解了enabled、geometry、windowTitle和windowIcon等属性的作用、API和使用示例。此外,还讨论了资源管理机制,特别是qrc文件在处理静态资源中的应用。
摘要由CSDN通过智能技术生成

控件概述

Widget 是QT中的核心概念,英文原意是“小部件”,我们此处也把它翻译成“控件”;
控件是构成一个图形化界面的重要因素!
在这里插入图片描述
向上诉例子中的:按钮、多行输入框、树形视图、下拉框等等,都可以称为控件;

QT作为一个成熟的GUI开发框架,内置了大量的的常用控件。这一点可以在QT Designer中看出端倪:
在这里插入图片描述
并且QT也提供了“自定义控件”的能力,可以让程序员在现有控件不能满足需求的情况下,对现有控件进行扩展或者手搓出新的控件;

综上: 学习QT,其中一个很重要的过程就是熟悉并掌握QT内置的常用控件;
这些控件对于我们快速开发出符合需求的产品,是至关重要的;

关于控件体系的发展

控件是GUI程序开发中通用的概念,不仅仅局限于QT中
第一阶段:
完全没有控件的概念,此时需要通过一些绘图API手动的绘制出按钮或者输入框等内容,代码编写比较繁琐;
例如:文曲星的Lava开发平台;
在这里插入图片描述
第二阶段:
逐渐引入控件的概念,但是此时只包含粗略的控件,只是提供了按钮、输入框、复选框等最常用的的控件;
例如html的原生控件;
在这里插入图片描述
第三阶段:
随着时代的发展,新的GUI开发体系越来越丰富,提供的控件的数量和质量越来越提升了;
更完整的控件体系,基本可以覆盖到GUI开发中的大部分场景了;
例如:早期的MFC、VB、C++ Builder、QT、Delphi,后来的Android SDK、Java FX、前端的各种UI库等等;
在这里插入图片描述

上图是前端中Element-ui中的控件概述,无论是丰富程度还是颜值,都比QT自带的控件更甚一筹;

当然了,QT也不是不可以开发出这种比较现代的控件,比如:QT官方提供了一个叫QT Design Studio的开发平台,这个开发出来的图形化界面,是对标现代水准的控件,属于业界一流,缺点就是需要氪金。

QWidget 核心属性

在QT中,使用QWidget类表示“控件”,像按钮、视图、输入框、滚动条等具体的控件类,都是继承自QWidget。
可以说,QWidget中就包含了QT整个控件体系中,通用的部分;
在QTDesigner中,随便拖拽一个控件过来,选中该控件,即在右下方,看到该控件的QWidget属性:
在这里插入图片描述

这些属性可以直接通过,QT Designer直接进行修改,也可以通过代码的方式直接进行修改;
这些属性的具体含义在QT官方文档中都存在,我们只需要在QT官方文档中搜索QWidget类即可;
在这里插入图片描述

QWidget的核心属性概览

属性作用
enabled设置控件是否有用.true表示可用,false表示不可用
gemetry位置和尺寸。包含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针对输⼊框有效, ⽤来提⽰⽤⼾当前能输⼊的合法数据的格式. ⽐如只能输⼊数字, 只能输⼊⽇期等.

接下来我们会介绍其中⼀些⽐较重要⽐较常⽤的属性, 并附有代码⽰例.

enabled

API说明
isEnabled()获取到空间的状态
setEnabled(bool )设置控件是否可用,true表示可用,false表示禁止
  1. 所谓的“禁止”是指该控件不能再接收来自用户的任何操作或指令,并且外观上往往都是灰色;
  2. 如果一个控件被禁用,那么这个控件在对象树上的子元素控件也会被禁用.

eg: 我们现在,在窗口上设计两个按钮控件,一个控件为A,一个控件为B,当我们点击控件B的时候,就能切换控件A的禁用状态和开启状态:

图形化界面的方式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

C++代码的实现方式:
在这里插入图片描述
在这里插入图片描述

当然了,我们也可以直接在QT Designer中的右下角直接进行勾选,即可:
在这里插入图片描述

geometry

位置和尺寸,实际上是这四个的统称:
x: 横坐标
y: 纵坐标
width: 宽度
height: 高度
在这里插入图片描述
但是实际开发中, 我们并不会直接使⽤这⼏个属性, ⽽是通过⼀系列封装的⽅法来获取/修改.

API说明
geometry获取到当前控件的的位置和尺寸信息,返回的是一个QRect,包含了x,y、width、height,其中x,y是控件左上角的坐标
setGeometry(QRect)设置一下当前控件的位置和尺寸
setGeometry(x,y,width,height)设置控件的位置和尺寸,可以直接设置一个Qrect,也可以四个属性单独设置

eg:
在界面上有5个控件,其中一个为目标控件;
另外四个分别为:up、down、left、right控件
当我们点击up控件过后,目标控件就会向上移动,当我们点击down控件过后,目标控件就会向下移动,以此类推;

图形化界面的方式:
在这里插入图片描述
在这里插入图片描述
实际运行效果:
在这里插入图片描述
我们可以发现,这样,做出来的效果似乎,不仅目标控件的按钮发生了变化,我们的尺寸也发生了变化,这时我们不希望看见的,为此,为了解决这个问题,我们就需要使用setGeometry()的第二个版本;
修改过后的代码如下:
在这里插入图片描述
运行结果:
在这里插入图片描述
当然,上述的代码中使用move来移动也是可以的;

eg2:
写一个表白程序;
在界面上右3个控件,其中一个为label控件,用来记录表白语言;
两个按钮控件,一个接收按钮,一个拒绝按钮;
当女神点击接受按钮,那么我们就改变标签里的内容;
当女神点击拒绝按钮,那么我们就将拒绝按钮移走;
在这里插入图片描述

在这里插入图片描述

运行结果:
在这里插入图片描述
当然,我们可以再狠一点,当用户按下这个按钮,我们就移动这个拒绝控件:
这一点的话,据需要为我们按钮的pressed信号有关了,clicked信号是按下在升起才会触发,而pressed信号是按下过后就会触发:
在这里插入图片描述
代码如下:
在这里插入图片描述
运行结果:在这里插入图片描述

当然,我们还可以做的更绝一点,当用户将鼠标放到拒绝按钮上,我们就移动我们的拒绝按钮:但是对应的代码也会更复杂,需要⾃定义类继承⾃ QPushButton, 重写 mouseMoveEvent ⽅法. 此处暂时不展开.

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

在这里插入图片描述

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 对象.

认真观察上⾯的表格, 可以看到, 其实这⾥的 API 有 frameGeometry 和 geometry 两个就⾜够
完成所有的需求了.
为什么要提供这么多功能重复的 API 呢?
这个就涉及到 Qt API 的设计理念了: 尽量符合⼈的直觉.
举个栗⼦, Qt 的 QVector, 尾插元素操作, 有以下⽅法:
• push_back
• append
• +=
• <<
上述⽅法的效果都是等价的. 即使不翻阅⽂档, 单纯的凭借直觉就能把代码写对.

展示一下geometry()和frameGeometry()的区别:注意只有最开始的窗口控件的geometry()和frameGeometry()是有区别的!!!!!其它控件是没有的
eg:
在这里插入图片描述
我们可以看到,geometry()和frameGeometry()都是一样的,这与我们的预期不太符合,这是怎么回事?
主要是因为:
在构造方法中,Widget控件刚刚创建出来,还没有加入到对象树中,此时还不具备Window frame。

因此,我们可以设置一个按钮,通过点击按钮来查看geometry()和frameGeometry()的区别:
在这里插入图片描述

在这里插入图片描述

windowTitle

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

注意: 上述操作,针对不同的控件,可能会有不同的行为,如果是顶层窗口,这个操作才会生效;
如果是子控件,那么这个操作无任何效果;

eg:
在这里插入图片描述
对于子控件来说:
在这里插入图片描述
对于子控件来说,windowTitle操作和setWindowTitle操作是无效的,因此我们在使用的时候需要注意一下;

windowIcon

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

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

  1. 先在D盘下放一个图标,记住你图标的名字(我这里是Imp.png)
    在这里插入图片描述
  2. 修改widget.cpp
    在这里插入图片描述
  3. 运行结果如下:
    在这里插入图片描述

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

但是对于QT程序来说,当前工作目录是会变化的,比如通过QT Creator运行的程序,当前工作目录就是项目的创建目录;而直接双击exe运行,工作目录则是exe所在目录;(注意:QT中exe文件和源文件是不在通过一个目录下的!)
在这里插入图片描述

注意, 上述 构建⽬录, 是随时可删除的. ⽐如点击菜单栏中的 “构建” -> “清理项⽬” , 就会把这个⽬录中
的内容清空掉.
因此如果我们把图⽚⽂件放到构建⽬录中, 可能在不⼩⼼删除后就丢失了. 我们还是希望能够把图⽚和
源代码放到⼀起, 并且使我们的程序⽆论拷⻉到任何位置中都能正确使⽤图⽚.

Qt 使⽤ qrc 机制帮我们⾃动完成了上述⼯作, 更⽅便的来管理项⽬依赖的静态资源.
qrc ⽂件是⼀种XML格式的资源配置⽂件, 它⽤XML记录硬盘上的⽂件和对应的随意指定的资
源名称. 应⽤程序通过资源名称来访问这些资源.
在Qt开发中, 可以通过将资源⽂件添加到项⽬中来⽅便地访问和管理这些资源. 这些资源⽂件
可以位于qrc⽂件所在⽬录的同级或其⼦⽬录下.
在构建程序的过程中, Qt 会把资源⽂件的⼆进制数据转成 cpp 代码, 编译到 exe 中. 从⽽使依
赖的资源变得 “路径⽆关”.
这种资源管理机制并⾮ Qt 独有, 很多开发框架都有类似的机制. 例如 Android 的 Resources
和 AssetManager 也是类似的效果.

简而言之,qrc机制大概工作流程就是:

  1. 先用一个xml格式的文件来描述和获取我们的图标信息;
  2. 在QT编译的时候会根据这个xml文件,编译成对应的C++代码,之后程序如果想要访问图标资源只需要访问这一段C++代码即可;这样的话,就不怕用户把图标“误删”的操作了;

通过qrc机制来创建图标:

  1. 右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫做resource.qrc(.qrc后缀名可加可不加)
    在这里插入图片描述
  2. 在 qrc 编辑器中, 添加前缀.
    在这里插入图片描述
    此处我们前缀设置成 / 即可.

所谓的前缀, 可以理解成 “⽬录” . 这个前缀决定了后续我们如何在代码中访问资源

  1. 在 资源编辑器 中, 点击 add Files 添加资源⽂件. 此处我们需要添加的是 Imp.png
    在这里插入图片描述

添加的⽂件必须是在 qrc ⽂件的同级⽬录, 或者同级⽬录的⼦⽬录中. 因此我们需要把之前 D 盘
中的 Imp.png 复制到上述⽬录中.

添加完毕后, 可以在 资源编辑器 中看到添加好的⽂件
在这里插入图片描述
4. 在代码中使用Imp.png文件
在这里插入图片描述

注意上述路径的访问规则

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南猿北者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值