【QT】--常用控件(QWidget的核心属性)

一、控件概念

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

像上述⽰例中的,按钮,列表视图,树形视图,单⾏输⼊框,多⾏输⼊框,滚动条,下拉框等,都可以称为"控 件"。

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

二、 QWidget的核⼼属性

Qt中的各种控件都是继承自QWidget类

那么也就是说Qt控件体系中,QWidget为通用的部分。

在我们的Qt Creator右侧,可以看到QWidget的各种属性,而且可以在此处对这些属性进行编辑,上述的属性,我们有需要的可以通过文档,或者AI来进行了解。

下面我们对其比较重要的属性进行讲解。

1、enabled

其描述的是一个控件是否处于可用状态

那么其和相对的概念就是禁用

所谓禁用指的是该控件不能接收任何用户的输入事件,并且外观上往往是灰色的

如果一个widget被禁用,则该widget的子元素也是被禁用的

那么我们可以使用下面的API来对控件的enabled进行获取和设置:

isEnabled():获取到控件的可用状态

setEnabled:设置控件是否可被使用,true表示可用,false表示禁用

下面我们通过代码来感受一下:

可以看到此时的按钮颜色变成了灰色。

上面的代码我们是在程序运行开始就将按钮进行禁用了,后面我们可以在一些条件满足的情况下进行禁用和可用的调整。

下面我们可以通过一个按钮,产生信号然后调用槽函数来控制另外一个按钮设置成禁用状态,下面我们来实践一下:

如上,我们的ui中就存在两个控件,对于这个要补充的是:

在同一个界面中,要求不同的控件的objectName也是必须不同的,后续我们可以通过ui->objectName方式来获取到对应控件对象。

在Qt中,会使用元编程,会根据ui文件,生成一个ui_widget.h文件,生成的过程就会感知到,界面上都有那些控件,每个的objectName。

我们的QPushButton提供的信号还挺多的,那么我们最常用的就是clicked,那么这个信号其有两个版本,一个是无参数的,一个是带bool参数的,那么对于QPushButton来说使用无参数的即可,这是因为checked带bool参数的,其表示是否可被勾选,这个东西对于pushButton来说没有实质性意义。

如上,我们就可以通过信号和槽的方式来对按钮的状态进行变化。

2、geometry

这个属于本意是几何,那么其实际上是四个属性的统称

x,y,width,height

那么x和y就表示的是坐标,然后width就表示的是宽度,然后height就是高度。

那么总的来说就是我们当前控件的位置和尺寸。

如上所示。

在实际开发中,我们并不会直接去使用这几个属性,而是通过一系列的方法来获取或者修改。

我们使用geometry(),可以获取到控件的位置和尺寸,其返回结果是一个ORect,其包含了x,y,width,height。其中x,y是左上角的坐标。

然后对于ORect,其就是矩形,在Qt中对一些几何上的概念进行了封装,就比如QPoint,那么其就表示一个点,然后QRect就表示一个矩形。这种是属于小对象,其里面的属性非常少,那么其占用空间就小。

然后我们可以使用:

setGeometry(ORect),setGeometry(int x,int y,int width,int height);

上述就是对控件的位置和尺寸进行设置,那么可以直接设置一个ORect,也可以分为四个属性进行单独设置。

前面我们还提到了一个move,那么其只是对控件的坐标进行修改。

下面我们通过代码来演示一下:

首先是我们的初始ui如上,那么我们后续通过代码,我们要实现的效果是,我们使用下面的四个按钮,然后实现上面的target控件的位置实现移动。

不过上面的代码中,我们对target这个按钮的改变,其实际效果是在调整左上角的位置,左上角的位置改变的同时,高度和宽度也同时发生了改变。

那么我们要实现整体的平移效果的话,那么就要使用到setGeometry的单独对每个属性进行修改的版本了。

如上的方式,那么就可以实现整体的平移,按钮的大小不变。

3、window frame

下面我们补充一点:

在我们Qt中形成的窗口中,会有一栏window frame窗口框架,那么这个是操作系统自带的。

那么我们的按钮的坐标,其起始位置是在那边呢?

在Qt中,关于位置尺寸,提供了很多的API,有的API的位置信息是以Widget本体左上角为原点的,也就是不考虑window frame。

那么有的就是以window frame为原点的

那么我们在代码中,使用frameGeometry,那么其就是以window frame为源点的坐标。

所以我未来对于按钮的位置,我们也要去关注其起始原点是那个。

4、windowsTitle

这个属性就是控件的窗口标题。

那么我们可以使用windowTitle():获取到控件的窗口标题

setWindowTitle(const QString & title):设置控件的窗口标题

不过要注意的是,当前的windowsTitle属性,其是从属于QWidget的,那么QWidget其是一个广泛的概念,windowTitle属性,只能针对顶层窗口这样的QWidget才有效。

5、windowlcon

表示窗口的图标

就是这个图标。

然后我们可以使用如下的API:

windowlcon():获取到控件的窗口图标,返回Qlcon对象

setWinndowlocn(const Qlcon&icon):设置控件的窗口图标。

然后Qlcon,这个也是Qt中封装的一个类,就表示一个图标。

补充:

前面我们对于对象的创建,我们推荐使用堆来创建,主要是可以确保当前的控件的生命周期是足够的,然后其可以通过Qt对象树来释放对象

Qlcon自身是一个比较小的对象,那么其创建出来后,就是要设置到QWidget里面,那么Qlcon对象本身释放与否,不会影响图标最终的显示。

Qlcon也不支持对象树,无法给他执行父对象。

所以我们直接将其设置到栈区即可。

然后对于图片,在Qt中有一个qrc机制,那么这个机制是确保我们的图片所在的路径在目标客户机器上存在,确保我们的图片不会被用户弄没。

在我们的Qt项目上,会引入一个额外的xml文件,其后缀名使用.qrc表示,在这个xml中要把使用的图片资源给导入进来,并且在xml中进行记录,Qt在编译项目的时候,就会根据描述的图片信息,然后找到图片内容,并且提取出图片的二进制数据,然后把这些二进制数据转成C++代码,然后最终编译到exe中。

不过其也有缺点:

无法导入太大的资源文件,就比如几个GB这种视频文件。

6、qrc的使用

在我们的当前项目中,创建一个新文件,然后呢,选择文件和类中的Qt,然后选择

Qt Resource File。

我们要选创建一个前缀,那么前缀实际上我们可以理解成虚拟的目录,那么这个目录其实并没有真实的存在我的电脑上,是Qt自己抽线出来的。

qrc的机制本质上就是把图片的二进制数据转成C++代码,最终我们会在代码中看到很大的char数据,那么里面就是图片的二进制数据。

然后为了方便Qt代码中访问到这个图片,Qt就自己抽线出了虚拟的目录。

然后我们将前缀设置成/即可。

设置好前缀后,我们就要将使用到的图片资源导入到资源文件中,那么我们按Add Files。

这个按钮在创建prefix之前是禁用的,那么创建好prefix之后就可以使用了,添加的文件就是添加到prefix下面的

点击add Files得到的目录就是当前代码所在的目录,那么导入图片的时候,需要确保你的图片必须在resource.qrc的同级目录里面。

看到这个效果,那么就说明图片导入成功了。

7、windowOpacity

这个是和控件的不透明数值。

其有如下API:

windowOpacity():获取到控件的不透明值,其返回float,其取值为0.0->1.0,其中0.0表示全透明,1.0表示完全不透明。

然后我们可以通过:

setWindowOpacity(float n):设置控件的不透明数值。

8、cursor

这个属性就是可以修改我们鼠标光标的样式。

其有如下API:

首先我们看前两个,那么其都是在我们的Widget级别的同一个界面,不同的控件,可以设置成不同的光标

第三个就是设置全局光标,程序内的全局,不是系统级别的全局。

在Qt中存在很多内置的光标,然后我们也可以自定义光标。

我们就要将图片导入到项目中,就是前面说到的qrc管理中,然后在代码中访问到这个图片,基于这个图片构造出光标对象然后进行设置。

然后我们Qt代码中,是使用QPixmap通过这个对象来访问一个图片。

要注意的是,我们的鼠标点击,其实际上是一个点,那么鼠标点击的时候,相当于点击图片的左上角进行点击,那么我们可以在构造鼠标图标的时候传参,一个x,y,就是后面再传入两个整型数据。

那么这个点,我们称为热点,就是鼠标点击的时候生效的位置。

然后对于光标,我们可以使用QPixmap对象提供的scaled方法来调整。

9、font

这个属性就是表示和字体相关的了。

其有如下API:

和上面一样在Qt中,也将其进行封装成了一个类

这个类有如下属性

10、toolTip

我们的一个GUI程序,界面比较复杂,按钮也比较多,那么当我们将鼠标悬停在这个控件上的时候,那么其会弹出一个提示

其有如下的API:

第一个就是设置提示的内容,第二个就是设置提示的时间。

11、focusPolicy

这个属性是一个焦点,这个焦点对于键盘操作非常明显

就比如界面上有一个输入框,此时必须要选中这个输入框,那么接下来键盘按键才会输入到输入框中,如果选中的是别的控件,或者是别的窗口,那么此时键盘的输入就不会进入到这个输入框中。

其API如下:

然后这个Qt::FocusPolicy,其是一个枚举类型,其取值如下:

12、styleSheet

这个属性是可以通过CSS设置widget的样式表

样式,其描述的界面具体是啥样子的。

CSS其是层叠样式表,在进行网页开发的时候,设置网页样式的方式

然后在Qt中,其将CSS参考过来,然后搞了一套QSS。

这个属性就是可以设置我们的样式的颜色,或者控件和窗口的颜色等。

那么我们实际在写代码的时候,那么是通过三个元素来进行设置:

RGB:

其就是我们屏幕发光的三原色,R:红 G:绿 B:蓝

在计算机中,通常会使用一个字节表示R,一个字节表示G,一个字节表示B。

最终我们表示一个颜色,就使用如下格式:

rgb(255,1,255);

那么如上的意思就是,红色和蓝色拉满,绿色一点点,然后三者混合成一个颜色

然后如果是16进制来表示:

#FF01FF

和上面的表示一样。

在这里我们可以使用qq截图,然后其会显示其具体数值。

其内置了取色器。

相关推荐
Best-Wishes1 小时前
去除vmdk linux镜像密码
linux·运维·服务器
吴声子夜歌1 小时前
Guava——反射
java·开发语言·guava
lingran__1 小时前
Git 完全指南(三):远程仓库与标签管理
开发语言·git·gitee·ssh·团队协作·远程仓库·分布式版本控制
for_ever_love__1 小时前
python爬虫: 数据解析
开发语言·爬虫·python·xpath
yyuuuzz1 小时前
中小企业出海上云:一次服务器选型踩坑记录
运维·服务器
学习星球1 小时前
AI 一句话生成 3D 游戏世界:腾讯 HY-World 2.0 开源深度解析与本地实战
开发语言·人工智能·游戏·3d·ai·课程设计·ai编程
名字还没想好☜1 小时前
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复
开发语言·后端·golang·go
励志不掉头发的内向程序员1 小时前
LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之鼠标事件与RS_ActionDrawLine
c++·qt·学习·架构·计算机外设