[QT]常用控件属性一
一:什么是控件属性
Qt 作为一款成熟的 GUI 开发框架,内置了丰富的常用控件,这一点在 Qt Designer 中有着直观的体现。同时,Qt 还提供了强大的 “自定义控件” 功能,允许开发者在现有控件无法满足需求时,对其进行扩展或全新控件的定制开发
在 Qt Designer 中,任意拖入一个控件并选中后,其右侧属性面板会显示该控件继承自 QWidget 的相关属性。这些属性既可以通过 Qt Designer 进行可视化修改,也能够通过代码方式进行编程控制。
而对于 Qt 学习而言,熟悉并掌握其内置常用控件是一项核心任务,这些控件是快速构建符合需求界面的关键基础。在 Qt 框架中,所有 “控件” 均以 QWidget 类为基础表示。无论是按钮、视图、输入框还是滚动条等具体控件类,均继承自 QWidget。可以说,QWidget 类封装了 Qt 整个控件体系中的通用功能与属性。
关于这些属性的具体含义,Qt Assistant 中提供了详尽的文档说明。开发者可在 Qt Assistant 中搜索 QWidget 查阅对应文档,也可在 Qt Creator 中选中 QWidget 类后按下 F1 键快速访问相关说明。下面我将一一介绍一些简单且常见的控件与属性!
二:常见控件属性
2.1:enabled
在 Qt 框架中,enabled描述了一个控件是否处于“可用”状态,"禁用"(Disabled)状态指的是控件无法接收任何用户输入事件,且通常会以灰色化的视觉效果呈现,以明确提示用户该控件当前不可交互。
值得注意的是,控件的禁用状态具有层级继承性:当一个 QWidget 控件被设置为禁用状态时,其所有子控件也会自动处于禁用状态,无论子控件自身的状态设置如何。这一特性是基于Qt的对象树机制形成的,确保了界面交互逻辑的一致性,避免了在父控件不可用时子控件仍能响应操作的矛盾情况。下面给出控件禁用示例:
我们可以看到,运⾏程序后, 可以看到按钮处于灰⾊状态, ⽆法被点击。因此槽函数也因为无法点击而不能运行,但是这只是在构造函数中直接禁用的,下面我将再给出一个例子,通过按钮2 切换按钮1 的禁⽤状态,具体如下所示:
程序运行时,初始状态下上方按钮处于可用状态,点击该按钮可正常触发槽函数。当首次点击下方的切换按钮时,上方按钮会进入禁用状态 —— 呈现灰色外观且无法响应点击操作;再次点击下方切换按钮时,上方按钮将解除禁用状态,恢复正常可交互状态,此时再次点击上方按钮即可重新触发槽函数执行。
同时,Qt也可以在Qt Designer 中创建按钮的时候, 可以设置按钮的初始状态是 "可⽤" 还是 "禁⽤",
如果把 enabled 这⼀列的对钩去掉, 则按钮的初始状态是 “禁用” 状态.对钩选上则是“可用”状态。
2.2:geometry
在 Qt 框架中,geometry
属性用于完整描述一个控件的位置与尺寸信息,它是由四个核心属性共同构成的集合,分别为:x
(横坐标)、y
(纵坐标)、width
(宽度)和 height
(高度)。
需要特别说明的是,Qt 采用左手坐标系作为界面布局的坐标基准 ——即坐标系的原点(0,0 点)位于当前控件父元素的左上角。基于这一坐标系规则,geometry
中的 x
和 y
属性具体指代的是当前控件左上角顶点在其父元素坐标系中的位置坐标,而 width
和 height
则分别表示控件在水平方向和垂直方向上的尺寸大小。通过这四个属性的组合,能够精确确定控件在父元素中的布局位置及自身大小,为界面元素的精确定位和布局管理提供了基础支持。具体如下所示:

下面,我们通过geometry和setgeometry这两个api来实现一个案例:一个控件被其他几个按键控制上下左右放大缩小,具体如下所示:
//上移槽函数
void My_Widget::on_pushButton_up_clicked()
{QRect my_rect=ui->pushButton->geometry();//获取当前要移动控件的位置和尺寸(QRect)qDebug()<<"向上移动前的位置:"<<my_rect;//向上移动时width和height不变,X也不变,y变小ui->pushButton->setGeometry(my_rect.x(),my_rect.y()-5,my_rect.width(),my_rect.height());qDebug()<<"向上移动后的位置:"<<my_rect;
}//下移槽函数
void My_Widget::on_pushButton_down_clicked()
{QRect my_rect=ui->pushButton->geometry();qDebug()<<"向下移动前的位置:"<<my_rect;//向上移动时width和height不变,X也不变,y变大ui->pushButton->setGeometry(my_rect.x(),my_rect.y()+5,my_rect.width(),my_rect.height());qDebug()<<"向下移动后的位置:"<<my_rect;
}//左移槽函数
void My_Widget::on_pushButton_left_clicked()
{QRect my_rect=ui->pushButton->geometry();qDebug()<<"向左移动前的位置:"<<my_rect;//向上移动时width和height不变,Y也不变,x变小ui->pushButton->setGeometry(my_rect.x()-5,my_rect.y(),my_rect.width(),my_rect.height());qDebug()<<"向左移动后的位置:"<<my_rect;
}//右移槽函数
void My_Widget::on_pushButton_right_clicked()
{QRect my_rect=ui->pushButton->geometry();qDebug()<<"向右移动前的位置:"<<my_rect;//向上移动时width和height不变,Y也不变,x变大ui->pushButton->setGeometry(my_rect.x()+5,my_rect.y(),my_rect.width(),my_rect.height());qDebug()<<"向右移动后的位置:"<<my_rect;
}//放大槽函数
void My_Widget::on_pushButton_big_clicked()
{QRect my_rect=ui->pushButton->geometry();qDebug()<<"变大前的位置:"<<my_rect;my_rect.setWidth(my_rect.width()+10);my_rect.setHeight(my_rect.height()+10);ui->pushButton->setGeometry(my_rect.x()-5,my_rect.y()-5,my_rect.width(),my_rect.height());qDebug()<<"变大后的位置:"<<my_rect;
}//缩小槽函数
void My_Widget::on_pushButton_small_clicked()
{QRect my_rect=ui->pushButton->geometry();qDebug()<<"变小前的位置:"<<my_rect;my_rect.setWidth(my_rect.width()-10);my_rect.setHeight(my_rect.height()-10);ui->pushButton->setGeometry(my_rect.x()+5,my_rect.y()+5,my_rect.width(),my_rect.height());qDebug()<<"变小后的位置:"<<my_rect;
}
下面再给出一个通过geometryapi的小案例,“无法拒绝,具体如下所示”:
#include "my_widget.h"
#include "ui_my_widget.h"My_Widget::My_Widget(QWidget *parent): QWidget(parent), ui(new Ui::My_Widget)
{ui->setupUi(this);srand(time(NULL));//种下时间戳种子
}My_Widget::~My_Widget()
{delete ui;
}
//同意
void My_Widget::on_pushButton_clicked()
{ui->lineEdit->setText("我们做一辈子好朋友!!!");
}//拒绝(按键按下)clicked信号
void My_Widget::on_pushButton_2_clicked()
{//获取窗口的大小int width = this->geometry().width();int height =this->geometry().height();//随机生成数字,模除窗口大小,保证按钮在窗口内活动int x = rand()%width;int y = rand()%height;//将按键移动到随机位置ui->pushButton_2->move(x,y);
}//拒绝(按键按下前)pressed信号
void My_Widget::on_pushButton_2_pressed()
{int width = this->geometry().width();int height =this->geometry().height();int x = rand()%width;int y = rand()%height;ui->pushButton_2->move(x,y);
}
程序运行后,可观察到如下交互效果:当点击 "不要" 按钮时,该按钮会立即发生位置移动;而点击 "同意" 按钮时,标签栏的文本内容则会相应改变。
上述功能实现所采用的是clicked
信号(鼠标按下并释放后的事件)和pressed
信号(鼠标按下时的事件)。若进一步采用mouseMoveEvent
事件,则能实现更激进的交互效果 —— 只要鼠标移动至按钮区域,按钮就会自动移动。
不过,实现这一功能的代码相对复杂,需要通过自定义类继承QPushButton
,并重写其mouseMoveEvent
方法来完成。关于这部分内容,此处暂不做详细展开。
2.3windowframe
什么是Windowsframe呢?简而言之,就是在我们创建窗口时,Windowframe会给我们窗口头部加上一个标题栏以及四周加上一圈细边,具体如下所示:
我们学习 Windowframe(窗口框架)控件的核心原因,在于它会直接影响 widget(组件)的 geometry(几何属性)计算。当一个 widget 作为独立窗口存在时(即带有标题栏、最小化、最大化及关闭按钮),其尺寸与坐标的计算存在两种不同方式:包含窗口框架与不包含窗口框架。
具体来说,x()、y()、frameGeometry()、pos()、move() 这些方法,均以 “包含窗口框架” 为基准进行计算;而 geometry()、width()、height()、rect()、size() 这些方法,则是以 “不包含窗口框架” 为基准来计算的。具体如下所示:
因此,在 Qt 中,由于 Windowframe(窗口框架)的存在,控件的尺寸与坐标计算形成了两套 API:一套是不包含 Windowframe 的,即上述与 geometry 相关的 API;另一套则是包含 Windowframe 的,具体如下所示:
下面我们分别调用两种api打印出窗口加与不加Windowframe的坐标尺寸,具体如下所示:
2.4:windowTitle
WindowTitle是一个简单的属性,其作用就是可以修改窗口标题,api如下所示:
但需要注意的是,并非所有窗口都能设置 WindowTitle
。因为 WindowTitle
是 QWidget
类的属性,而 QWidget
涵盖范围极广,WindowTitle
仅对顶层窗口这类 QWidget
生效。例如,窗口内的按钮等非顶层控件,就无法设置 WindowTitle
,具体如下所示:
我们可以看到,只有对顶层 widget(独立窗口)进行相关操作时,才会产生效果。要是操作的是子 widget,该操作不会有任何效果,不过也不会出现报错提示。实际上,这种无效果却不报错的设定是不合理的,毕竟既然操作存在错误,就应该强制报错,否则很难察觉到错误。
2.5:windowIcon
windowIcon=表示窗口的图标,它主要作用于顶层窗口(独立窗口,同上述的windowTitle一样, 上述操作仅针对顶层 widget 有效),会在窗口标题栏左侧显示对应的图标,同时在任务栏、窗口切换器等系统界面中,该图标也会作为窗口的标识出现。具体api如下所示:
一般我们不太会用到上面的api来获取控件的窗口图标,基本上都是使用下面的api,具体如下所示:
在实际开发中,我们通常不会在代码里用绝对路径引入图片。因为无法确保程序发布后,用户电脑上也存在相同路径;若使用相对路径,虽需保证代码写法与图片实际路径匹配(比如代码写为 “./image/ahxh.jpg”,就需在当前工作目录创建 image 目录并放入图片),但相对路径也无法完全保证图片能和文件一起打包。
此外,若将图片放在构建目录,不小心删除后就会丢失,此时程序也就无法运行。所以我们更希望图片与源代码放在一起,且程序无论复制到何处都能正常使用图片。而 Qt 的 qrc 机制恰好能自动完成上述工作,更方便地管理项目依赖的静态资源!
qrc 文件是 XML 格式的资源配置文件,它通过 XML 记录硬盘文件及其对应的自定义资源名称,应用程序通过资源名称访问这些资源。
在 Qt 开发中,可将资源文件添加到项目中以便访问和管理,这些资源文件可位于 qrc 文件同级目录或其子目录下。
程序构建时,Qt 会将资源文件的二进制数据转换为 cpp 代码并编译到 exe 中,使依赖资源实现 “路径无关”。
这种资源管理机制并非 Qt 独有,许多开发框架都有类似设计,例如 Android 的 Resources 和 AssetManager 也能实现类似效果。具体使用qrc机制管理图片作为图标如下所示:
运⾏程序, 可以看到图标已经能正确设置.同时我们也可以找到qrc导入的图片资源,我们可以进⼊到项⽬的构建⽬录, 可以看到, ⽬录中多了⼀个 qrc_resource.cpp ⽂件. 直 接打开这个⽂件, 可以看到类似如下代码,具体如下所示:
我们能看到,上述代码其实是借助 unsigned char
数组来存储图片的二进制数据,把 ahxh.jpg
里的每个字节都记录下来。这些代码会被编译进 exe 文件中,后续不管 exe 文件被复制到哪个目录,都能确保访问到该图片资源。所以,qrc 这套资源管理方案,优点和缺点都很突出。
优点在于,它能保证图片、字体、声音等资源真正实现 “目录无关”,无论怎样都不会出现资源丢失的情况。
缺点是,它不适合管理体积大的资源。要是资源比较大(比如是几 MB 的文件),或者资源数量特别多,最终生成的 exe 文件体积就会很大,程序运行时消耗的内存也会增加,程序编译的时间也会明显变长。
2.6:WindowOpacity
WindowOpacity
是 Qt 中用于控制窗口透明度的属性,它的值范围通常为 0.0 到 1.0(0.0 表示完全透明,1.0 表示完全不透明)。
通过设置该属性,可调整整个顶层窗口(包括其标题栏、边框及客户区内容)的透明程度,产生半透明等视觉效果。例如,将 WindowOpacity
设为 0.5 时,窗口会呈现半透明状态,能隐约看到窗口下方的内容。此属性同样主要作用于顶层窗口,对子控件设置通常不会产生效果。下面是具体的api:
下面我们通过在界⾯上拖放两个按钮, 分别用来增加不透明度和减少不透明度.并且打印出透明度,具体如下所示:
运行程序后可见,首次点击加号按钮时,不透明度(亮度)已达最大;连续点击减号按钮时,透明度(暗度)会逐渐降低,同时控制台也会显示 opacity 值的变化。但需注意,窗口透明度的变化并不精确,原因在于:
C++ 中的 float 类型遵循 IEEE 754 标准,运算时会存在一定精度误差,例如 1 - 0.1 的结果并非精确的 0.9。因此在编程中,需慎重使用 float 这类浮点型。
2.7:cursor
在 Qt 中,cursor
指的是鼠标光标,即鼠标指针在界面上显示的样式。
它是 QWidget
类的属性,用于控制鼠标悬停在控件或窗口上时的光标外观。Qt 提供了多种预设光标样式(如箭头、手形、文本输入光标、等待光标等),也支持自定义光标(通过图片等资源设置)。
通过 setCursor()
方法可以为特定控件或窗口设置光标样式,当鼠标进入该区域时,光标就会显示为设定的样式,离开后则恢复默认样式。这一属性在提升用户交互体验方面很有用,例如在按钮上显示手形光标,提示用户可点击。具体api如下所示:
接下来我们可以通过多种方式设置 cursor,首先介绍在 Qt Designer 中的设置方法:直接在右侧属性编辑区,将按钮的 cursor 属性修改为 “打开手势” 即可,具体如下所示:
我们也可以通过代码设置按钮的光标类型,具体如下所示:
上面我们通过 Qt 内置的光标类型,修改了光标在界面上显示的样式。由于截图没办法捕捉到鼠标光标,可自行运行验证!实际上,除了使用 Qt 提供的光标类型,我们也能够自定义光标类型,具体如下所示(由于截图没办法捕捉到鼠标光标,可自行运行验证):
//通过QPixmap对象来接收自定义图标,并通过qrc将图片导入QPixmap my_pixmap(":/ahxh.jpg");//可以通过scaled函数来调整自定义图标大小my_pixmap=my_pixmap.scaled(60,60);// 创建QCursor对象,//QCursor my_cursor(my_pixmap);//也可以创建QCursor对象并指定 "热点" 为 (2, 2) 坐标位置.//所谓"热点"就是⿏标点击时⽣效的位置.QCursor my_cursor(my_pixmap,10,10);//设置自定义图标this->setCursor(my_cursor);
2.8:font
在 Qt 中,font
是用于控制文本显示样式的属性,涵盖字体家族(如宋体、微软雅黑、Arial 等)、字号大小、是否加粗、是否斜体、是否下划线等文本格式信息。
作为 QWidget
类的属性,它适用于几乎所有能显示文本的控件(如标签、按钮、输入框等),可通过设置调整文本外观。其中,setFont()
方法用于设置字体样式,font()
方法用于获取当前字体配置,下面给出相关 API:
需要注意的是,setFont()
方法中涉及的 QFont
,是 Qt 中表示字体的类,封装了字体家族(如 "SimSun"、"Arial")、字号、粗细、斜体、下划线等各种属性。
它是设置控件字体的核心类,通过 QWidget
的 setFont()
方法为控件应用字体样式时,传入的正是 QFont
对象。例如,可创建 QFont
实例并配置属性,再应用到标签、按钮等控件,实现文本显示样式的自定义。
此外,QFont
还支持字体匹配、字体 Metrics(如字符宽度、高度等度量信息)获取等功能,是 Qt 中处理文本字体相关操作的基础类。下面给出相关 API:
接下来我们可以通过多种方式设置 font,首先介绍在 Qt Designer 中的设置方法:直接在右侧属性编辑区设置控件的 font 相关属性,具体如下所示:
我们也可以通过代码设置font的相关属性,具体如下所示:
2.9:toolTip
在 Qt 中,toolTip
是控件的提示信息属性,用于在鼠标悬停在控件上时显示简短说明。因为一个GUI程序,界面比较复杂,控件比较多,当用户将鼠标指针短暂停留在按钮、标签等控件上时,会弹出一个小浮窗,展示 toolTip
中设置的文本内容,帮助用户理解该控件的功能或用途。
通过 setToolTip()
方法可以为控件设置提示文本,toolTip()
方法可获取当前提示内容。这一属性能提升界面的易用性,尤其对功能不明显的控件,可通过提示文本引导用户操作。具体API如下所示:

2.10:focuspolicy
在 Qt 框架中,focusPolicy
是 QWidget
类(所有界面组件的基类)的一个重要属性,用于控制组件如何获取键盘焦点(即组件是否能接收键盘输入以及通过何种方式获取焦点)。所谓 "焦点" , 指的就是能选中这个元素. 接下来的操作 (⽐如键盘操作), 就都是针对该焦点元素进⾏的了. 这个对于 输⼊框, 单选框, 复选框等控件⾮常有用的.具体api如下所示:
Qt::FocusPolicy
其实是一个枚举类型,主要包括以下几种:
Qt::NoFocus
:组件不能接收键盘焦点,无论通过何种方式都无法获得焦点,也就无法响应键盘输入。
Qt::TabFocus
:组件可以通过按 Tab 键(或 Shift+Tab 反向切换)获得焦点,这是键盘导航的常用方式。
Qt::ClickFocus
:组件可以通过鼠标点击获得焦点,但不能通过 Tab 键切换获得。
Qt::StrongFocus
:组件既可以通过 Tab 键切换获得焦点,也可以通过鼠标点击获得焦点(最常用的设置,适用于需要频繁通过键盘和鼠标交互的组件,如按钮、输入框等)。
通过设置不同的 focusPolicy
,就可以精确控制界面组件的焦点行为,例如:
让按钮既能被点击聚焦,也能通过 Tab 键选中
让某些辅助性组件(如纯显示用的标签)无法获得焦点,避免干扰键盘导航!
下面给出具体示例来理解不同的 focusPolicy,如下所示:
设置四个输入框的 focusPolicy 属性为 Qt::StrongFocus(默认值,通常无需额外修改),运行程序后,在第一个输入框中,通过鼠标单击或 Tab 键即可移动光标到对应输入框,后续输入便针对这个获得焦点的输入框进行。
若将第二个输入框的 focusPolicy 改为 Qt::NoFocus,该输入框既不能被 Tab 键选中,也无法通过鼠标左键选中,自然也不能输入内容。
第三个输入框若设置为 Qt::TabFocus,则只能通过 Tab 键选中,无法用鼠标选中。
第四个输入框若设置为 Qt::ClickFocus,则只能通过鼠标选中,无法用 Tab 键选中。
2.11:stylesheet
在 Qt 中,stylesheet
(样式表)是一种用于自定义界面组件外观的机制,类似于网页开发中的 CSS(层叠样式表)。它允许开发者通过文本格式的规则来设置组件的颜色、字体、边框、背景等视觉属性,而无需修改组件的逻辑代码。
Qt 样式表的语法与 CSS 非常相似,支持选择器(指定要设置样式的组件)、属性(如颜色、字体)和值(属性的具体设置)。
通过样式表,开发者可以快速美化界面,实现个性化的视觉效果,而不必深入自定义组件的绘制逻辑,是 Qt 中实现界面美化的常用方式。下面我们见一见样式表以及如何找到样式表。
这里的语法格式与 CSS 相同,采用键值对方式设置样式,键和值之间用:分隔,键值对之间用;分隔。此外,Qt Designer 仅能校验样式的基本格式,无法检测出 Qt 不支持的样式,例如 text-align: center 这样的文本居中设置就不被支持。所以下面我们用代码的方式来展示如何使用。具体如下所示:
我们可以看到,通过设置窗口文本框及按钮的 stylesheet,能切换其属性,但 Qt 内置的 black、white 等颜色较为固定,若需要浅一点的颜色该怎么办?我们知道,计算机中用 “像素” 表示屏幕上的基本单位(即一个发亮的光点),每个光点用三个字节表示颜色,分别是 R(red)、G(green)、B(blue),一个字节的取值范围是 0-255 或 0x00-0xFF,混合三种颜色的数值比例,可搭配出千万种颜色。
rgb (255, 0, 0)、#FF0000 或 #F00 表示纯红色;rgb (0, 255, 0)、#00FF00 或 #0F0 表示纯绿色;rgb (0, 0, 255)、#0000FF 或 #00F 表示纯蓝色;rgb (255, 255, 255)、#FFFFFF 或 #FFF 表示纯白色;rgb (0, 0, 0)、#000000 或 #000 表示纯黑色。
当然,上述规则仅针对一般程序,实际显示器可能有 8bit 或 10bit 色深等,情况更复杂,因此日常开发中我们不太使用 Qt 内置的 black、white 等颜色,而是通过 rgb 数字配置颜色,具体如下所示:
void My_Widget::on_pushButton_light_clicked()
{//设置背景颜色为白色//this->setStyleSheet("background-color:rgb(#F3F3F3);");this->setStyleSheet("background-color:rgb(240,240,240);");//设置文本框颜色为白色,字体为黑色ui->plainTextEdit->setStyleSheet("background-color:white;color:rgb(0,0,0);");//设置按钮颜色为黑色ui->pushButton_light->setStyleSheet("color:rgb(0,0,0);");ui->pushButton_dark->setStyleSheet("color:rgb(0,0,0);");
}void My_Widget::on_pushButton_dark_clicked()
{//设置背景颜色为黑色this->setStyleSheet("background-color:rgb(0,0,0);");//设置文本框颜色为黑色,字体为白色ui->plainTextEdit->setStyleSheet("background-color:rgb(0,0,0);color:rgb(240,240,240);");//设置按钮颜色为白色ui->pushButton_light->setStyleSheet("color:rgb(240,240,240);");ui->pushButton_dark->setStyleSheet("color:rgb(240,240,240);");
}
三:总结
综上所述,上面是对Qt中一些非常非常常见且重要的属性进行了一些讲解总结与使用,当然还有很多的属性与控件没有介绍,后面的博客我将继续学习并总结,目前的这些控件属性总结只是我简单且浅薄的认识,如有错误之处,请各位大佬指正!