
🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

文章目录
- 前言:
- [一. Qt 控件基础认知:是什么?有哪些?](#一. Qt 控件基础认知:是什么?有哪些?)
-
- [1.1 控件的本质以及常用核心控件](#1.1 控件的本质以及常用核心控件)
- [1.2 控件的核心父类:QWidget](#1.2 控件的核心父类:QWidget)
- [二. QWidget 核心属性实战:手把手教你用](#二. QWidget 核心属性实战:手把手教你用)
-
- [2.1 enabled:控件的启用 / 禁用状态](#2.1 enabled:控件的启用 / 禁用状态)
- [2.2 geometry:控件的位置与尺寸](#2.2 geometry:控件的位置与尺寸)
- [2.3 windowTitle:窗口标题](#2.3 windowTitle:窗口标题)
- [2.4 windowIcon:窗口图标](#2.4 windowIcon:窗口图标)
- [2.5 资源文件(qrc):解决路径依赖问题](#2.5 资源文件(qrc):解决路径依赖问题)
- [三. 关键避坑指南](#三. 关键避坑指南)
- 结尾:
前言:
Qt 的控件体系是 GUI 开发的基石 ------ 按钮、输入框、标签等控件构成了界面的基本要素。而控件的核心属性(如启用状态、位置尺寸、窗口标题 / 图标)直接决定界面的交互逻辑和视觉效果。本文从 Qt 控件的基础认知、QWidget 核心属性
(enabled、geometry、windowTitle、windowIcon),到资源文件(qrc)的使用,层层递进拆解实战技巧,帮你快速掌握控件的核心用法,为复杂界面开发打牢基础。
一. Qt 控件基础认知:是什么?有哪些?
1.1 控件的本质以及常用核心控件
Qt 中的 "控件(Widget)" 是构成图形界面的基本单元,英文原义为 "小部件",本质是继承自QWidget类的可视化组件。无论是按钮、输入框,还是窗口本身,本质上都是控件。Qt 内置了覆盖大部分 GUI 场景的控件,常用分类如下:
- 按钮类:Push Button(普通按钮)、Radio Button(单选框)、Check Box(复选框);
- 显示类:Label(标签)、LCD Number(数字显示)、ProgressBar(进度条);
- 输入类:Line Edit(单行输入框)、Text Edit(多行输入框)、Combo Box(下拉框);
- 容器类:Group Box(分组框)、Tab Widget(标签页);
- 布局类:Vertical Layout(垂直布局)、Horizontal Layout(水平布局)、Grid Layout(网格布局)。


1.2 控件的核心父类:QWidget
所有 Qt 控件都直接或间接继承自QWidget类,它封装了所有控件的通用属性和行为(如位置、尺寸、启用状态、鼠标光标等)。掌握QWidget的核心属性,就能举一反三应用到所有控件上。
| 属性 | 类型 | 说明 | 重要性 |
|---|---|---|---|
| windowTitle | QString |
窗口标题,显示在标题栏 | ⭐⭐⭐⭐⭐ |
| geometry | QRect |
控件的位置和大小(包含边框) | ⭐⭐⭐⭐⭐ |
| size | QSize |
控件的大小(不含边框) | ⭐⭐⭐⭐⭐ |
| pos | QPoint |
控件的位置(相对父窗口) | ⭐⭐⭐⭐⭐ |
| enabled | bool |
控件是否启用(可交互) | ⭐⭐⭐⭐⭐ |
| visible | bool |
控件是否可见 | ⭐⭐⭐⭐⭐ |
| styleSheet | QString |
CSS样式表(Qt样式) | ⭐⭐⭐⭐⭐ |
| windowFlags | Qt::WindowFlags |
窗口类型标志 | ⭐⭐⭐⭐⭐ |
| sizePolicy | QSizePolicy |
布局中的大小策略 | ⭐⭐⭐⭐⭐ |
| minimumSize | QSize |
最小尺寸限制 | ⭐⭐⭐⭐ |
| maximumSize | QSize |
最大尺寸限制 | ⭐⭐⭐⭐ |
| windowIcon | QIcon |
窗口图标 | ⭐⭐⭐⭐ |
| windowModality | Qt::WindowModality |
窗口模态类型 | ⭐⭐⭐⭐ |
| focusPolicy | Qt::FocusPolicy |
焦点获取策略 | ⭐⭐⭐⭐ |
| hidden | bool |
控件是否隐藏 | ⭐⭐⭐⭐ |
| palette | QPalette |
调色板(颜色方案) | ⭐⭐⭐⭐ |
| font | QFont |
字体设置 | ⭐⭐⭐⭐ |
| toolTip | QString |
工具提示文本 | ⭐⭐⭐ |
| cursor | QCursor |
鼠标光标形状 | ⭐⭐⭐ |
| layoutDirection | Qt::LayoutDirection |
布局方向(左到右/右到左) | ⭐⭐⭐ |
| statusTip | QString |
状态栏提示文本 | ⭐⭐⭐ |
| contextMenuPolicy | Qt::ContextMenuPolicy |
右键菜单策略 | ⭐⭐⭐ |
| acceptDrops | bool |
是否接受拖放操作 | ⭐⭐⭐ |
| updatesEnabled | bool |
是否允许更新绘制 | ⭐⭐⭐ |
| mouseTracking | bool |
是否启用鼠标跟踪 | ⭐⭐⭐ |
| autoFillBackground | bool |
是否自动填充背景 | ⭐⭐⭐ |
| backgroundRole | QPalette::ColorRole |
背景色角色 | ⭐⭐⭐ |
| foregroundRole | QPalette::ColorRole |
前景色角色 | ⭐⭐⭐ |
| windowOpacity | qreal |
窗口不透明度(0.0-1.0) | ⭐⭐⭐ |
| minimumHeight | int |
最小高度 | ⭐⭐⭐ |
| minimumWidth | int |
最小宽度 | ⭐⭐⭐ |
| maximumHeight | int |
最大高度 | ⭐⭐⭐ |
| maximumWidth | int |
最大宽度 | ⭐⭐⭐ |
| whatsThis | QString |
"这是什么?"帮助文本 | ⭐⭐ |
| tabletTracking | bool |
是否启用数位板跟踪 | ⭐⭐ |
| inputMethodHints | Qt::InputMethodHints |
输入法提示 | ⭐⭐ |
| accessibleName | QString |
无障碍访问名称 | ⭐⭐ |
| accessibleDescription | QString |
无障碍访问描述 | ⭐⭐ |
| baseSize | QSize |
基础大小 | ⭐⭐ |
| sizeIncrement | QSize |
大小增量 | ⭐⭐ |
二. QWidget 核心属性实战:手把手教你用
QWidget的核心属性可通过 Qt Designer 可视化修改,也可通过代码动态设置,下面重点讲解最常用的 5 个属性及实战场景。
2.1 enabled:控件的启用 / 禁用状态
控制控件是否能接收用户交互(如点击、输入),禁用时控件会自动变灰,子控件也会继承禁用状态。
核心 API:
isEnabled():获取控件当前启用状态(返回bool);setEnabled(bool flag):设置启用状态(true启用,false禁用)。
实战示例 1:创建禁用状态的按钮
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建按钮并设置禁用
QPushButton *button = new QPushButton("禁用按钮", this);
button->setEnabled(false); // 禁用后按钮变灰,无法点击
}
实战示例 2:切换控件启用状态
通过一个按钮切换另一个按钮的启用 / 禁用:
- 用 Qt Designer 拖两个按钮,
objectName分别为pushButton_target和pushButton_switch; - 编写切换按钮的槽函数:
cpp
void Widget::on_pushButton_switch_clicked()
{
// 获取目标按钮当前状态,设置成相反状态
bool enable = ui->pushButton->isEnabled();
if(enable)
ui->pushButton->setEnabled(false);
else
ui->pushButton->setEnabled(true);
}

- 效果 :点击 "切换" 按钮,目标按钮在 "启用(正常颜色)" 和 "禁用(灰色)" 之间切换。

2.2 geometry:控件的位置与尺寸
控制控件的坐标(相对于父控件)和宽高,是布局之外定位控件的核心属性。核心规则如下:
- 坐标系:以父控件左上角为原点(0,0),X 轴向右递增,Y 轴向下递增;
- 核心 API :
geometry():获取位置和尺寸(返回QRect,包含 x、y、width、height);setGeometry(QRect):直接设置一个QRect;setGeometry(int x, int y, int width, int height):直接设置位置和尺寸;move(int x, int y):仅修改位置,保持尺寸不变;resize(int width, int height):仅修改尺寸,保持位置不变。

实战示例:用四个方向按钮控制目标按钮移动
- 拖放 5 个按钮:
pushButton_target(目标按钮)、pushButton_up/down/left/right(方向按钮); - 编写方向按钮的槽函数:
cpp
void Widget::on_pushButton_up_clicked()
{
// 获取目标按钮当前位置和尺寸
QRect rect = ui->pushButton_target->geometry();
qDebug() << rect;
// 1. 这样的其实是在移动左上角的点,宽度和高度也会改变
// rect.setY(rect.y() - 5);
// ui->pushButton_target->setGeometry(rect);
// 2. 只改变位置,不改变大小
ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());
}
void Widget::on_pushButton_down_clicked()
{
QRect rect = ui->pushButton_target->geometry();
qDebug() << rect;
// rect.setY(rect.y() + 5);
// ui->pushButton_target->setGeometry(rect);
ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());
}
void Widget::on_pushButton_left_clicked()
{
QRect rect = ui->pushButton_target->geometry();
qDebug() << rect;
// rect.setX(rect.x() - 5);
// ui->pushButton_target->setGeometry(rect);
ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}
void Widget::on_pushButton_right_clicked()
{
QRect rect = ui->pushButton_target->geometry();
qDebug() << rect;
// rect.setX(rect.x() + 5);
// ui->pushButton_target->setGeometry(rect);
ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());
}

实战综合案例:表白程序(结合 geometry 和 enabled 属性,实现一个 "无法拒绝" 的表白程序)
- 界面设计 :拖放一个 Label(显示 "做我女票好不好?")、两个按钮(
pushButton_accept"欣然接受"、pushButton_reject"残忍拒绝"); - 核心逻辑:点击 "残忍拒绝" 时,按钮随机移动,无法被点击;点击 "欣然接受" 时,修改标签文本。
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QRandomGenerator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setFixedSize(800, 600); // 固定窗口大小
this->setWindowTitle("表白神器");
}
// 欣然接受按钮槽函数
void Widget::on_pushButton_accept_clicked()
{
ui->label->setText("太好了!");
}
// 残忍拒绝按钮槽函数(鼠标按下时移动,这里用的 pressed 更好点)
void Widget::on_pushButton_reject_pressed()
{
// 生成随机坐标(不超出窗口范围)
int width = this->geometry().width();
int height = this->geometry().height();
int x = rand() % width;
int y = rand() % height;
// 移动按钮
ui->pushButton_reject->move(x, y);
}

- 效果:点击 "残忍拒绝" 时,按钮随机跳动,无法点击;只能点击 "欣然接受",趣味十足。
- 声明:这个程序只作为演示使用娱乐一下哈哈,大家可别真拿这玩意去表白啊。这是有点不靠谱的,其实写情书送花啥的也都差不多,主要表白这件事就不是很靠谱,表白是胜利的宣言,而不是冲锋的号角!
补充知识点:window Frame
windowFrame 是 QWidget 中控制窗口边框的核心属性,决定了窗口是否显示系统默认边框(标题栏 + 边框),是实现 "无边框窗口" 的关键,常配合自定义标题栏、圆角窗口等场景使用。我们这里暂时只了解一下它对一些操作的影响

cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QRect rect1 = this->geometry();
QRect rect2 = this->frameGeometry();
qDebug() << rect1;
qDebug() << rect2;
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QRect rect1 = this->geometry();
QRect rect2 = this->frameGeometry();
qDebug() << rect1;
qDebug() << rect2;
}


2.3 windowTitle:窗口标题
设置顶层窗口(独立窗口)的标题,子控件设置此属性无效。
核心 API:
windowTitle():获取窗口标题;setWindowTitle(const QString& title):设置窗口标题。
实战示例:设置程序窗口标题
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置窗口标题
this->setWindowTitle("Qt控件属性实战");
// 窗口初始尺寸
this->resize(800, 600);
}
- 效果:程序运行后,窗口标题栏显示 "Qt 控件属性实战"。

2.4 windowIcon:窗口图标
设置顶层窗口的图标(标题栏图标 + 任务栏图标),同样仅对顶层窗口有效。
核心 API:
windowIcon():获取窗口图标(返回QIcon对象);setWindowIcon(const QIcon& icon):设置窗口图标。
实战示例 1:直接通过路径设置图标
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 加载本地图片作为图标(Windows路径支持/或\\)
QIcon icon("D:/Gitee.code/qt-learning/code/QWidget_6/Lotso.jpg");
// 相对路径会更好点,但是也无法解决一些问题,需要qrc来解决
this->setWindowIcon(icon);
}


- 注意:路径不能有中文,建议使用相对路径或资源文件(下文详解)。

2.5 资源文件(qrc):解决路径依赖问题
直接使用本地路径设置图标存在隐患(程序拷贝到其他电脑后路径失效),Qt 的 qrc 资源文件机制能将图片、字体等资源编译到程序中,实现 "路径无关"。
qrc 文件的核心作用:
- 本质:XML 格式的资源配置文件,记录硬盘文件与程序内部资源名的映射;
- 优势:资源被编译到 exe 中,无需担心路径变化,跨平台兼容;
- 适用场景:图片、图标、配置文件等静态资源(大的视频文件这种就不太适用了)。
实战示例 2:通过 qrc 设置窗口图标
- 创建 qrc 文件 :
右键项目 → "添加新文件" → 选择 "Qt Resource File" → 命名为resource.qrc;打开 qrc 文件,点击 "Add Prefix" → 前缀设为/(相当于根目录);点击 "Add Files" → 选择要添加的图标文件(如Lotso.jpg),确保文件在项目目录下。


- 代码中使用 qrc 资源:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
ui->setupUi(this);
// 访问qrc资源:前缀+文件名,以:开头
QIcon icon(":/Lotso.jpg");
this->setWindowIcon(icon);
this->setWindowTitle("基于qrc的图标设置");
}
- 关键语法 :
:/前缀/文件名,前缀为 qrc 中设置的/,因此直接写:/Lotso.jpg。 - 原理 :Qt 编译时会将 qrc 资源转换为
qrc_resource.cpp文件(存储为字节数组),最终编译到 exe 中,实现资源永久绑定。

三. 关键避坑指南
- 路径问题 :设置图标、图片时,避免使用绝对路径(如
D:/images/rose.jpg),优先使用 qrc 资源文件; - 父控件影响:子控件的位置(geometry)相对于父控件,而非屏幕;禁用父控件会同步禁用所有子控件;
- windowTitle/windowIcon 生效范围:仅对顶层窗口(无父控件的 Widget)有效,子控件设置无效;
- qrc 资源命名:qrc 的前缀和文件名不能有中文,否则可能导致资源无法加载;
- enabled 状态:禁用的控件无法接收点击、输入等用户交互,但仍可通过代码修改其属性。

结尾:
html
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:本文覆盖了 Qt 控件的基础认知、QWidget 核心属性(enabled、geometry、windowTitle、windowIcon)、qrc 资源管理,以及综合实战案例。这些知识点是 Qt 界面开发的必备基础,掌握后可灵活应对大部分简单界面的开发需求。后续可进一步学习控件的其他属性(如 font、toolTip、styleSheet)。
✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど
