目录
[QWidget 核心控件之 QPushButton(按钮)](#QWidget 核心控件之 QPushButton(按钮))
[QIcon 类解析](#QIcon 类解析)
[buttonIcon->setIcon 函数解析](#buttonIcon->setIcon 函数解析)
[QSize 类解析](#QSize 类解析)
[buttonIcon->setIconSize 函数解析](#buttonIcon->setIconSize 函数解析)
[buttonKey->setText 函数解析](#buttonKey->setText 函数解析)
[key1 和 key2 设置快捷键的方式解析](#key1 和 key2 设置快捷键的方式解析)
[buttonKey->setShortcut 函数解析](#buttonKey->setShortcut 函数解析)
[buttonKey->setAutoRepeat 函数解析](#buttonKey->setAutoRepeat 函数解析)
总结
[QWidget 核心控件之 Radio Button(单选按钮)](#QWidget 核心控件之 Radio Button(单选按钮))[setChecked 函数解析](#setChecked 函数解析)
[setCheckable 函数解析](#setCheckable 函数解析)
[setEnabled 函数解析](#setEnabled 函数解析)
[setAutoExclusive 函数解析](#setAutoExclusive 函数解析)
[clicked (bool) 信号与 toggled 信号解析](#clicked (bool) 信号与 toggled 信号解析)
[QButtonGroup 类解析](#QButtonGroup 类解析)
总结
[QWidget 核心控件之 Check Box(复选按钮)](#QWidget 核心控件之 Check Box(复选按钮))[QCheckBox 类解析](#QCheckBox 类解析)
[isChecked 函数解析](#isChecked 函数解析)
总结
[QWidget 核心控件之 Label(显示文本/图片)](#QWidget 核心控件之 Label(显示文本/图片))[setTextFormat 函数解析](#setTextFormat 函数解析)
[Qt::PlainText 枚举值解析](#Qt::PlainText 枚举值解析)
[Qt::RichText 枚举值解析](#Qt::RichText 枚举值解析)
[Qt::MarkdownText 枚举值解析](#Qt::MarkdownText 枚举值解析)
[QPixmap 类解析](#QPixmap 类解析)
[setScaledContents 函数解析](#setScaledContents 函数解析)
[resizeEvent 虚函数解析](#resizeEvent 虚函数解析)
[QResizeEvent 类解析](#QResizeEvent 类解析)
[setAlignment 函数解析](#setAlignment 函数解析)
[Qt::AlignHCenter 等枚举值解析](#Qt::AlignHCenter 等枚举值解析)
[setWordWrap 函数解析](#setWordWrap 函数解析)
[setIndent 函数解析](#setIndent 函数解析)
[setBuddy 伙伴机制解析](#setBuddy 伙伴机制解析)
总结
[QWidget 核心控件之 LCD Number(计算器)](#QWidget 核心控件之 LCD Number(计算器))[QTimer 类解析](#QTimer 类解析)
[QLCDNumber 类解析](#QLCDNumber 类解析)
[display 函数解析](#display 函数解析)
[&QTimer::timeout 信号解析](#&QTimer::timeout 信号解析)
[start 函数解析](#start 函数解析)
[intValue 函数解析](#intValue 函数解析)
[stop 函数解析](#stop 函数解析)
总结
[QWidget 核心控件之 ProgressBar(进度条)](#QWidget 核心控件之 ProgressBar(进度条))[QProgressBar 类解析](#QProgressBar 类解析)
[setValue 函数解析](#setValue 函数解析)
[value 函数解析](#value 函数解析)
总结
[QWidget 核心控件之 Calendar Widget(日历)](#QWidget 核心控件之 Calendar Widget(日历))[QDate 类解析](#QDate 类解析)
[QCalendarWidget 类解析](#QCalendarWidget 类解析)
[selectedDate 函数解析](#selectedDate 函数解析)
[selectionChanged 信号解析](#selectionChanged 信号解析)
总结
[QWidget 核心控件之 Line Edit(单行输入框)](#QWidget 核心控件之 Line Edit(单行输入框))[QLineEdit 类解析](#QLineEdit 类解析)
[setPlaceholderText 函数解析](#setPlaceholderText 函数解析)
[setEchoMode (QLineEdit::Password) 函数解析](#setEchoMode (QLineEdit::Password) 函数解析)
[setEnabled 函数解析](#setEnabled 函数解析)
[QRegExp 类 + 正则表达式解析](#QRegExp 类 + 正则表达式解析)
[setValidator (new QRegExpValidator (regexp)) 函数解析](#setValidator (new QRegExpValidator (regexp)) 函数解析)
[textEdited 信号解析](#textEdited 信号解析)
[validator 函数 + validate 函数解析](#validator 函数 + validate 函数解析)
总结
[QWidget 核心控件之 Text Edit(多行输入框)](#QWidget 核心控件之 Text Edit(多行输入框))[QTextEdit 类解析](#QTextEdit 类解析)
[textChanged 信号解析](#textChanged 信号解析)
[toPlainText 函数解析](#toPlainText 函数解析)
[selectionChanged 信号解析](#selectionChanged 信号解析)
[QTextCursor 类解析](#QTextCursor 类解析)
[textCursor 函数解析](#textCursor 函数解析)
[selectedText 函数解析](#selectedText 函数解析)
[cursorPositionChanged 信号解析](#cursorPositionChanged 信号解析)
[position 函数解析](#position 函数解析)
[undoAvailable 信号解析](#undoAvailable 信号解析)
[redoAvailable 信号解析](#redoAvailable 信号解析)
[copyAvailable 信号解析](#copyAvailable 信号解析)
总结
[QWidget 核心控件之 Combo Box(下拉框)](#QWidget 核心控件之 Combo Box(下拉框))[QComboBox 类](#QComboBox 类)
[addItem 函数](#addItem 函数)
[QWidget 核心控件之 Slider(滑动条)](#QWidget 核心控件之 Slider(滑动条))[QShortcut 对象](#QShortcut 对象)
[QKeySequence 对象](#QKeySequence 对象)
[activated 信号](#activated 信号)
[horizontalSlider 对象](#horizontalSlider 对象)
[valueChanged 信号](#valueChanged 信号)
[QWidget 核心控件之 List Widget(链表)](#QWidget 核心控件之 List Widget(链表))[QListWidget 对象](#QListWidget 对象)
[addItem(new QListWidgetItem("C++"))](#addItem(new QListWidgetItem("C++")))
[currentRow 函数](#currentRow 函数)
[currentItemChanged 信号](#currentItemChanged 信号)
[QWidget 核心控件之 Table Widget(表格)](#QWidget 核心控件之 Table Widget(表格))removeColumn
[QWidget 核心控件之 Tree Widget(树形)](#QWidget 核心控件之 Tree Widget(树形))removeChild
[QWidget 核心控件之 BoxLayout(布局管理器)](#QWidget 核心控件之 BoxLayout(布局管理器))
QWidget 核心控件之 QPushButton(按钮)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton> // QPushButton按钮控件头文件
#include <QDebug> // Qt调试输出头文件(qDebug())
#include <QIcon> // QIcon图标类头文件(补充:使用QIcon必须包含)
#include <QSize> // QSize尺寸类头文件(补充:使用QSize必须包含)
#include <QKeySequence> // QKeySequence快捷键类头文件(补充:使用QKeySequence必须包含)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==================== 设置按钮的图标 ====================
// 创建QPushButton按钮控件,指定当前Widget为父对象,由Qt自动管理内存
QPushButton* buttonIcon = new QPushButton(this);
// 设置按钮上显示的文本内容
buttonIcon->setText("按钮");
// 设置按钮的位置和大小:x=100, y=100, 宽度150, 高度60
buttonIcon->setGeometry(100, 100, 150, 60);
// 创建QIcon图标对象,加载Qt资源文件中的dog.png图片(":/"为资源文件前缀)
QIcon icon(":/dog.png");
// 为按钮设置图标,图标会显示在按钮文本左侧(默认布局)
buttonIcon->setIcon(icon);
// 创建QSize对象,指定图标显示的尺寸为50×50像素
QSize size(50, 50);
// 设置按钮图标的显示尺寸,若不设置则使用默认尺寸(通常较小)
buttonIcon->setIconSize(size);
// ==================== 设置按钮的快捷键 ====================
// 创建第二个QPushButton按钮控件,指定当前Widget为父对象
QPushButton* buttonKey = new QPushButton(this);
// 设置按钮显示的文本内容
buttonKey->setText("设置快捷键");
// 设置按钮的位置和大小:x=100, y=200, 宽度150, 高度60
buttonKey->setGeometry(100, 200, 150, 60);
// 创建QKeySequence快捷键对象:单个按键"w"作为快捷键(等价于Qt::Key_W)
QKeySequence key1("w");
// 创建QKeySequence快捷键对象:组合键"CTRL+w"作为快捷键(等价于Qt::CTRL + Qt::Key_W)
QKeySequence key2("CTRL+w");
// 为按钮设置快捷键:按下"w"键等价于点击该按钮,触发clicked信号
buttonKey->setShortcut(key1);
// 绑定按钮的clicked信号到自定义槽函数button_key_clicked
connect(buttonKey, &QPushButton::clicked, this, &Widget::button_key_clicked);
// 开启按钮的自动重复功能:长按鼠标左键/按住快捷键时,会持续触发clicked信号
// 注:快捷键的自动重复是系统默认支持的,此设置主要针对鼠标点击的连发
buttonKey->setAutoRepeat(true);
}
Widget::~Widget()
{
delete ui;
}
// 按钮快捷键触发的槽函数
void Widget::button_key_clicked()
{
// Qt调试输出:在控制台打印字符"w"(需在项目运行时查看应用程序输出)
qDebug() << "w";
}
QIcon 类解析
QIcon 是 Qt 框架中专门用于管理图标资源的核心类,封装了图标加载、缩放、多状态显示(如正常 / 悬停 / 按下状态)等能力,适用于为按钮、菜单、窗口等控件设置图标,代码示例:
QIcon icon(":/dog.png");
- 资源加载:支持从 Qt 资源文件(
:/"前缀)、本地文件路径加载图标,兼容 png、jpg、ico 等主流图片格式; - 轻量特性:QIcon 属于值类型对象,栈上创建即可(无需
new),内部仅存储图标资源的引用 / 数据,作用域结束时自动销毁; - 适配能力:QIcon 会根据控件的显示需求自动缩放图标,保证不同尺寸下的显示效果,是 Qt 中图标管理的标准类。
buttonIcon->setIcon 函数解析
setIcon 是 QAbstractButton 类(QPushButton 的父类)的成员函数,核心作用是为按钮设置显示的图标,代码示例:
buttonIcon->setIcon(icon);
- 函数参数:
QIcon类型对象,即待显示的图标资源; - 显示规则:图标默认显示在按钮文本的左侧,与文本保持默认间距,也可通过样式表(QSS)调整图标与文本的布局(如居右、居上);
- 生效特性:设置后立即生效,若未设置
setIconSize,图标会以默认尺寸(通常为 16×16 像素)显示。
QSize 类解析
QSize 是 Qt 框架中用于描述尺寸(宽度 + 高度) 的轻量级值类型类,仅封装宽度(width)和高度(height)两个整型参数,用于定义控件、图标、图片等的显示尺寸,代码示例:
QSize size(50, 50);
- 构造参数:第一个参数为宽度(50 像素),第二个参数为高度(50 像素);
- 核心特性:QSize 未继承
QObject,无对象树能力,栈上创建即可,支持width()/height()获取尺寸、setWidth()/setHeight()修改尺寸; - 适用场景:常用于设置图标尺寸、控件最小 / 最大尺寸、图片缩放尺寸等场景。
buttonIcon->setIconSize 函数解析
setIconSize 是 QAbstractButton 类的成员函数,核心作用是指定按钮上图标的显示尺寸,代码示例:
buttonIcon->setIconSize(size);
- 函数参数:
QSize类型对象,即图标要显示的宽度和高度; - 生效逻辑:设置后按钮上的图标会强制缩放到指定尺寸(50×50 像素),覆盖 QIcon 的默认缩放规则;
- 注意事项:若设置的尺寸远大于图标原始尺寸,可能导致图标拉伸变形,需结合图标原始比例设置。
buttonKey->setText 函数解析
setText 是 QAbstractButton 类的成员函数,核心作用是设置按钮上显示的文本内容,代码示例:
buttonKey->setText("设置快捷键");
- 函数参数:字符串类型(const char*/QString),即按钮要显示的文本;
- 显示规则:文本默认与图标(若有)水平居中对齐,也可通过
setAlignment()调整对齐方式(如左对齐、居中); - 通用特性:所有继承 QAbstractButton 的控件(QPushButton、QCheckBox、QRadioButton 等)均可调用该函数。
key1 和 key2 设置快捷键的方式解析
QKeySequence 是 Qt 框架中用于描述快捷键组合的类,支持单个按键、组合按键两种快捷键定义方式,代码示例:
// 方式1:单个按键快捷键
QKeySequence key1("w");
// 方式2:组合按键快捷键
QKeySequence key2("CTRL+w");
- 单个按键方式(key1):参数为单个按键的字符 / 名称(如 "w"、"Enter"、"Space"),等价于 Qt 预定义的按键枚举(
Qt::Key_W、Qt::Key_Enter); - 组合按键方式(key2):参数为「修饰键 + 普通键」的组合,修饰键支持
CTRL、SHIFT、ALT、Meta(Windows 徽标键)等,键之间用+分隔,等价于Qt::CTRL + Qt::Key_W; - 兼容性:QKeySequence 会自动适配不同操作系统的快捷键规则(如 macOS 下
CTRL对应Command键),保证跨平台兼容性。
buttonKey->setShortcut 函数解析
setShortcut 是 QAbstractButton 类的成员函数,核心作用是为按钮绑定快捷键 ,按下快捷键等价于点击按钮,触发clicked信号,代码示例:
buttonKey->setShortcut(key1);
- 函数参数:
QKeySequence类型对象,即已定义的快捷键; - 触发逻辑:设置后,按下指定快捷键(如 "w" 键),按钮会自动触发
clicked信号,执行绑定的槽函数(button_key_clicked),无需鼠标点击; - 覆盖特性:一个按钮仅能绑定一个快捷键,重复调用
setShortcut会覆盖之前的设置。
buttonKey->setAutoRepeat 函数解析
setAutoRepeat 是 QAbstractButton 类的成员函数,核心作用是开启 / 关闭按钮的自动重复(连发)功能,代码示例:
buttonKey->setAutoRepeat(true);
- 函数参数:布尔类型(bool),
true开启自动重复,false关闭(默认值); - 触发规则:开启后,长按鼠标左键点击按钮 / 按住快捷键时,按钮会持续触发
clicked信号(连发),触发间隔由系统设置决定; - 生效范围:该设置主要针对鼠标点击的连发,快捷键的连发是操作系统默认支持的(即使不开启该函数,按住快捷键也会连发)。
快捷键连发与鼠标点击连发的特性解析
- 快捷键连发 :是操作系统的默认行为,无需手动开启
setAutoRepeat,按住绑定的快捷键(如 "w" 键)时,会持续触发按钮的clicked信号,执行槽函数; - 鼠标点击连发 :是 Qt 按钮的可选功能,默认关闭,需手动调用
setAutoRepeat(true)开启,开启后长按鼠标左键点击按钮,按钮会持续触发clicked信号,实现鼠标点击的连发效果; - 核心区别:快捷键连发依赖系统层实现,鼠标点击连发依赖 Qt 按钮的自动重复机制,两者独立控制,
setAutoRepeat仅影响鼠标点击的连发行为。
总结
- QIcon 用于管理图标资源,setIcon 为按钮设置图标,QSize 定义尺寸,setIconSize 指定按钮图标的显示尺寸;
- setText 设置按钮文本,QKeySequence 支持单个 / 组合按键的快捷键定义,setShortcut 为按钮绑定快捷键;
- setAutoRepeat 用于开启鼠标点击的连发功能,快捷键连发是系统默认支持的,无需手动开启。
QWidget 核心控件之 Radio Button(单选按钮)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug> // Qt调试输出头文件(qDebug())
#include <QButtonGroup> // QButtonGroup按钮分组类头文件(用于单选按钮分组)
#include <QRadioButton> // QRadioButton单选按钮控件头文件(补充:使用单选按钮必须包含)
#include <QLabel> // QLabel标签控件头文件(补充:使用标签必须包含)
// 前提:需在Widget类的private区域声明以下成员变量,否则编译报错
//private:
// QLabel* label; // 显示选中结果的标签
// QRadioButton* buttonMale; // 性别-男 单选按钮
// QRadioButton* buttonFemale; // 性别-女 单选按钮
// QRadioButton* buttonOther; // 性别-其他 单选按钮
// QRadioButton* buttonClickedBool; // 测试clicked(bool)信号的单选按钮
// QRadioButton* buttonToggled; // 测试toggled信号的单选按钮
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==================== 单选按钮的基本使用 ====================
// 创建QLabel标签控件,指定当前Widget为父对象,由Qt自动管理内存
label = new QLabel(this);
// 设置标签在窗口中的位置:x=100, y=100
label->move(100, 100);
// 创建"男"单选按钮控件,指定当前Widget为父对象
buttonMale = new QRadioButton(this);
// 创建"女"单选按钮控件,指定当前Widget为父对象
buttonFemale = new QRadioButton(this);
// 创建"其他"单选按钮控件,指定当前Widget为父对象
buttonOther = new QRadioButton(this);
// 设置"男"单选按钮的位置:x=100, y=200
buttonMale->move(100, 200);
// 设置"女"单选按钮的位置:x=100, y=300
buttonFemale->move(100, 300);
// 设置"其他"单选按钮的位置:x=100, y=400
buttonOther->move(100, 400);
// 设置"男"单选按钮显示的文本内容
buttonMale->setText("男");
// 设置"女"单选按钮显示的文本内容
buttonFemale->setText("女");
// 设置"其他"单选按钮显示的文本内容
buttonOther->setText("其他");
// 将"男"单选按钮设置为默认选中状态(单选按钮默认无选中项)
buttonMale->setChecked(true);
// 设置标签的初始显示文本,提示当前选中的性别
label->setText("您选择的性别为:男 ");
{
// 可选设置1:将"其他"选项设置为不能被选中(setCheckable(false)才是不可选,true为默认可选)
// buttonOther->setCheckable(false);
// 可选设置2:直接禁用"其他"按钮(灰显,无法点击,也不会响应信号)
// buttonOther->setEnabled(false);
// 可选设置3:取消"其他"按钮的排他性
// 单选按钮默认开启AutoExclusive(排他性),同一父控件下的单选按钮只能选一个;
// 取消后,该按钮可与其他单选按钮同时选中(失去单选特性)
// buttonOther->setAutoExclusive(false);
}
// 关联"男"单选按钮的clicked信号到对应的槽函数(点击按钮时触发)
connect(buttonMale, &QRadioButton::clicked, this, &Widget::radioButton_male_clicked);
// 关联"女"单选按钮的clicked信号到对应的槽函数
connect(buttonFemale, &QRadioButton::clicked, this, &Widget::radioButton_famale_clicked);
// 关联"其他"单选按钮的clicked信号到对应的槽函数
connect(buttonOther, &QRadioButton::clicked, this, &Widget::radioButton_other_clicked);
// ==================== clicked(bool)信号 与 toggled信号 ====================
// 创建测试clicked(bool)信号的单选按钮,指定当前Widget为父对象
buttonClickedBool = new QRadioButton(this);
// 创建测试toggled信号的单选按钮,指定当前Widget为父对象
buttonToggled = new QRadioButton(this);
// 设置测试clicked(bool)信号按钮的位置:x=400, y=100
buttonClickedBool->move(400, 100);
// 设置测试toggled信号按钮的位置:x=400, y=200
buttonToggled->move(400, 200);
// 设置测试clicked(bool)信号按钮的显示文本
buttonClickedBool->setText("测试clicked(bool)信号");
// 设置测试toggled信号按钮的显示文本
buttonToggled->setText("测试toggled信号");
// 关联clicked(bool)信号到槽函数(信号带bool参数,标识按钮是否被选中)
connect(buttonClickedBool, &QRadioButton::clicked, this, &Widget::radioButton_clickedBool_clicked);
// 关联toggled信号到槽函数(按钮选中状态变化时触发,无论点击还是代码修改)
connect(buttonToggled, &QRadioButton::toggled, this, &Widget::radioButton_toggled_toggled);
// ==================== 通过QButtonGroup类来对单选按钮进行分组 ====================
// 创建第一个按钮分组对象,指定当前Widget为父对象(自动管理内存)
QButtonGroup* group1 = new QButtonGroup(this);
// 创建第二个按钮分组对象,指定当前Widget为父对象
QButtonGroup* group2 = new QButtonGroup(this);
// 将"男"单选按钮加入group1分组
group1->addButton(buttonMale);
// 将"女"单选按钮加入group1分组
group1->addButton(buttonFemale);
// 将"其他"单选按钮加入group1分组(group1内的按钮互斥,只能选一个)
group1->addButton(buttonOther);
// 将测试clicked(bool)信号的按钮加入group2分组
group2->addButton(buttonClickedBool);
// 将测试toggled信号的按钮加入group2分组(group2内的按钮互斥,与group1互不影响)
group2->addButton(buttonToggled);
}
Widget::~Widget()
{
delete ui;
}
// "男"单选按钮点击触发的槽函数
void Widget::radioButton_male_clicked()
{
// 更新标签文本,显示选中的性别为男
label->setText("您选择的性别为:男");
}
// "女"单选按钮点击触发的槽函数
void Widget::radioButton_famale_clicked()
{
// 更新标签文本,显示选中的性别为女
label->setText("您选择的性别为:女");
}
// "其他"单选按钮点击触发的槽函数
void Widget::radioButton_other_clicked()
{
// 特殊处理:若仅设置buttonOther->setCheckable(false)(不可选),按钮仍会响应clicked信号;
// 因此需在槽函数中判断按钮是否可选中,仅当可选中时才更新标签
if(buttonOther->isCheckable() == true)
{
label->setText("您选择的性别为:其他");
}
}
// 测试clicked(bool)信号的槽函数(参数checked:按钮是否被选中)
void Widget::radioButton_clickedBool_clicked(bool checked)
{
// 打印clicked信号的bool参数:选中为true,取消选中为false
qDebug() << "clicked: " << checked;
}
// 测试toggled信号的槽函数(参数checked:按钮当前是否被选中)
void Widget::radioButton_toggled_toggled(bool checked)
{
// 打印toggled信号的bool参数:选中状态变化时触发(点击/代码修改都会触发)
qDebug() << "toggled: " << checked;
}
单选按钮的默认排他性
QRadioButton(单选按钮) 核心特性为默认开启 AutoExclusive(排他性),无需手动配置即可实现 "单选" 效果,核心规则:
// 隐式默认配置,无需手动调用
buttonMale->setAutoExclusive(true);
buttonFemale->setAutoExclusive(true);
- 排他范围:同一父控件下的所有 QRadioButton,仅能有一个处于选中状态,点击其中一个时,其他单选按钮会自动取消选中;
- 设计逻辑:排他性是单选按钮的核心设计初衷(如性别选择、单项选项场景),是区别于 QCheckBox(复选框)的关键特征;
- 例外场景:父控件不同 / 手动取消 AutoExclusive 时,排他性失效,单选按钮可被同时选中。
setChecked 函数解析
setChecked 是 QAbstractButton 类(QRadioButton 的父类)的成员函数,核心作用是设置单选按钮的选中状态,代码示例:
buttonMale->setChecked(true);
- 函数参数:布尔类型(bool),
true为设置为选中状态,false为取消选中状态; - 生效特性:
- 设置为
true且按钮开启排他性时,同一父控件下的其他单选按钮会自动取消选中; - 单选按钮默认无选中项,需手动调用该函数设置默认选中项;
- 代码调用该函数修改状态时,会触发
toggled信号,但不会触发clicked信号(仅用户交互点击触发)。
- 设置为
setCheckable 函数解析
setCheckable 是 QAbstractButton 类的成员函数,核心作用是控制按钮是否可被选中,代码示例:
buttonOther->setCheckable(false); // 不可被选中
buttonOther->setCheckable(true); // 默认可被选中(默认值)
- 函数参数:布尔类型(bool),
true为按钮可被选中(点击 / 代码可修改选中状态),false为按钮不可被选中; - 关键特性:
- 设置为
false时,按钮无选中视觉状态,点击也无法改变选中状态,但仍会响应clicked信号; - QRadioButton 默认值为
true(可选中),QPushButton 默认值为false(不可选中)。
- 设置为
setEnabled 函数解析
setEnabled 是 QWidget 类的成员函数,核心作用是控制按钮是否可用(灰显 / 可交互),代码示例:
buttonOther->setEnabled(false); // 禁用按钮(灰显,不可点击)
buttonOther->setEnabled(true); // 启用按钮(默认值)
- 函数参数:布尔类型(bool),
true为启用按钮(可点击、响应信号),false为禁用按钮; - 生效特性:
- 禁用状态下,按钮视觉上灰显,无法通过鼠标 / 键盘点击,也不会响应
clicked/toggled等交互信号; - 禁用状态不影响代码修改选中状态(如
setChecked(true)仍可生效),仅限制用户交互。
- 禁用状态下,按钮视觉上灰显,无法通过鼠标 / 键盘点击,也不会响应
setAutoExclusive 函数解析
setAutoExclusive 是 QAbstractButton 类的成员函数,核心作用是开启 / 关闭按钮的排他性,代码示例:
buttonOther->setAutoExclusive(false); // 取消排他性
buttonOther->setAutoExclusive(true); // 开启排他性(QRadioButton默认值)
- 函数参数:布尔类型(bool),
true为开启排他性,false为取消排他性; - 生效特性:
- 取消排他性后,该按钮可与同一父控件下的其他单选按钮同时选中(失去单选特性);
- 排他性仅对 QRadioButton 有实际意义,QPushButton 默认关闭该属性;
- 不同父控件的单选按钮,即使开启排他性,也不会互斥。
clicked (bool) 信号与 toggled 信号解析
clicked (bool) 信号
clicked(bool) 是 QAbstractButton 类的信号,仅在用户交互点击按钮时触发,代码示例:
connect(buttonClickedBool, &QRadioButton::clicked, this, &Widget::radioButton_clickedBool_clicked);
- 信号参数:布尔类型(bool),
true表示点击后按钮被选中,false表示点击后按钮取消选中; - 触发条件:仅通过鼠标点击、键盘回车 / 空格触发,代码调用
setChecked()修改选中状态不会触发该信号; - 适用场景:需区分 "用户主动点击" 和 "代码修改状态" 的场景(如仅响应用户操作)。
toggled 信号
toggled 是 QAbstractButton 类的信号,在按钮选中状态发生变化时触发,代码示例:
connect(buttonToggled, &QRadioButton::toggled, this, &Widget::radioButton_toggled_toggled);
- 信号参数:布尔类型(bool),
true表示按钮变为选中状态,false表示变为未选中状态; - 触发条件:
- 用户点击按钮导致状态变化;
- 代码调用
setChecked()修改状态; - 排他性导致按钮自动取消选中;
- 适用场景:需监听所有选中状态变化的场景(无论用户操作还是代码修改)。
QButtonGroup 类解析
QButtonGroup 是 Qt 框架中用于对按钮进行分组管理的类,核心作用是打破 "父控件限制",实现任意按钮的排他分组,代码示例:
QButtonGroup* group1 = new QButtonGroup(this);
group1->addButton(buttonMale);
group1->addButton(buttonFemale);
group1->addButton(buttonOther);
- 核心能力:
- 分组排他:同一 QButtonGroup 内的 QRadioButton 强制互斥(即使父控件不同),不同分组间的按钮互不影响;
- 灵活管理:可通过
addButton()添加按钮、removeButton()移除按钮,动态调整分组; - 信号扩展:提供
buttonClicked()/buttonToggled()信号,可监听整个分组的按钮状态变化;
- 内存管理:创建时指定父对象(如
this),Qt 对象树机制自动管理内存,无需手动delete; - 设计逻辑:解决 "同一父控件下需多组单选按钮" 的场景(如页面有 "性别""学历" 两组单选,需各自排他)。
总结
- QRadioButton 默认开启 AutoExclusive 排他性,同一父控件下仅能选中一个,setAutoExclusive 可取消该特性;
- setChecked 设置选中状态,setCheckable 控制是否可选中,setEnabled 控制按钮是否可用(灰显);
- clicked (bool) 仅响应用户点击,toggled 监听所有状态变化,QButtonGroup 实现跨父控件的单选分组。
QWidget 核心控件之 Check Box(复选按钮)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel> // QLabel标签控件头文件(补充:使用标签必须包含)
#include <QCheckBox> // QCheckBox复选框控件头文件(补充:使用复选框必须包含)
#include <QPushButton> // QPushButton按钮控件头文件(补充:使用按钮必须包含)
#include <QString> // QString字符串类头文件(补充:使用QString必须包含)
// 前提:需在Widget类的private区域声明以下成员变量,否则编译报错
//private:
// QLabel* label; // 显示最终选择结果的标签
// QCheckBox* checkboxStudy; // "学习"选项的复选框
// QCheckBox* checkboxGame; // "游戏"选项的复选框
// QString result; // 拼接选择结果的字符串
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==================== 复选按钮的基本使用 ====================
// 创建QLabel标签控件,指定当前Widget为父对象,由Qt自动管理内存
label = new QLabel(this);
// 设置标签的初始显示文本
label->setText("今天的安排是: ");
// 设置标签在窗口中的位置:x=100, y=100
label->move(100, 100);
// 设置标签的固定宽度为300像素(避免文本过长时被截断,或过短时显示不全)
label->setFixedWidth(300);
// 创建"学习"选项的复选框控件,指定当前Widget为父对象
checkboxStudy = new QCheckBox(this);
// 创建"游戏"选项的复选框控件,指定当前Widget为父对象
checkboxGame = new QCheckBox(this);
// 设置"学习"复选框显示的文本内容
checkboxStudy->setText("学习");
// 设置"游戏"复选框显示的文本内容
checkboxGame->setText("游戏");
// 设置"学习"复选框的位置:x=100, y=200
checkboxStudy->move(100, 200);
// 设置"游戏"复选框的位置:x=100, y=300
checkboxGame->move(100, 300);
// 创建"确认"按钮控件,指定当前Widget为父对象
QPushButton* button = new QPushButton(this);
// 设置"确认"按钮显示的文本内容
button->setText("确认");
// 设置"确认"按钮的位置:x=100, y=400
button->move(100, 400);
// 关联"确认"按钮的clicked信号到自定义槽函数button_clicked
// 点击按钮时,触发槽函数,汇总复选框的选择结果并更新标签显示
connect(button, &QPushButton::clicked, this, &Widget::button_clicked);
}
Widget::~Widget()
{
delete ui;
}
// "确认"按钮点击触发的槽函数:汇总复选框选择结果并更新标签
void Widget::button_clicked()
{
// 初始化结果字符串,重置为初始文本(避免拼接历史内容)
result = "今天的安排是: ";
// 判断"学习"复选框是否被选中(isChecked()返回true表示选中)
if(checkboxStudy->isChecked() == true)
{
// 将"学习"复选框的文本拼接到结果字符串中
result += checkboxStudy->text();
// 拼接空格,优化显示格式(避免多个选项连在一起)
result += " ";
}
// 判断"游戏"复选框是否被选中
if(checkboxGame->isChecked() == true)
{
// 将"游戏"复选框的文本拼接到结果字符串中
result += checkboxGame->text();
// 拼接空格,优化显示格式
result += " ";
}
// 更新标签的显示文本,展示最终的选择结果
label->setText(result);
}
复选按钮的默认非排他性
QCheckBox(复选框) 核心特性为默认无排他性,无需手动配置即可实现 "多选" 效果,核心规则:
// 隐式默认配置,无需手动调用
checkboxStudy->setAutoExclusive(false);
checkboxGame->setAutoExclusive(false);
- 选择规则:同一父控件下的所有 QCheckBox 可被同时选中,点击其中一个时,其他复选框的选中状态不会发生变化;
- 设计逻辑:非排他性是复选框的核心设计初衷(如多项任务选择、兴趣标签勾选场景),是区别于 QRadioButton(单选按钮)的关键特征;
- 特殊场景:若手动调用
setAutoExclusive(true)开启排他性,QCheckBox 会具备单选按钮的特性(仅能选中一个),但这违背复选框的设计意图,极少使用。
QCheckBox 类解析
QCheckBox 是 Qt 框架中用于实现多选功能的核心控件类,继承自 QAbstractButton,是 GUI 界面中接收用户多项选择的基础组件,代码示例:
QCheckBox* checkboxStudy = new QCheckBox(this);
checkboxStudy->setText("学习");
checkboxStudy->move(100, 200);
- 核心能力:
- 多选支持:默认无排他性,可与同区域其他复选框同时选中;
- 文本配置 :通过
setText()设置复选框旁的说明文本,清晰标识选项含义; - 状态管理 :支持选中(勾选)、未选中(未勾选)两种基础状态,部分场景可扩展为三态(半选,通过
setTristate(true)开启);
- 内存管理:创建时指定父对象为当前 Widget(
this),Qt 对象树机制自动管理内存,无需手动delete; - 交互特性:点击复选框可切换选中 / 未选中状态,状态变化时会触发
clicked(bool)和toggled(bool)信号(与 QRadioButton 信号逻辑一致)。
isChecked 函数解析
isChecked 是 QAbstractButton 类(QCheckBox 的父类)的成员函数,核心作用是获取复选框的当前选中状态,代码示例:
if(checkboxStudy->isChecked() == true) {
result += checkboxStudy->text();
}
- 返回值类型:布尔类型(bool),
true表示复选框处于选中(勾选)状态,false表示处于未选中(未勾选)状态; - 调用场景:
- 汇总用户选择结果时(如示例中点击 "确认" 按钮后,遍历复选框判断选中状态);
- 监听状态变化时,辅助判断当前状态(结合
toggled信号使用);
- 特性补充:该函数仅读取状态,不会修改复选框的选中状态,也不会触发任何信号。
总结
- QCheckBox 默认无排他性,同一父控件下可同时选中多个,是区别于 QRadioButton 的核心特征;
- QCheckBox 是 Qt 实现多选功能的基础控件,支持选中 / 未选中两种基础状态;
- isChecked 函数用于获取复选框的选中状态,返回 bool 值,是汇总多选结果的核心接口。
QWidget 核心控件之 Label(显示文本/图片)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QRadioButton> // QRadioButton单选按钮头文件
#include <QLabel> // QLabel标签核心头文件
#include <QFrame> // QFrame枚举(如QFrame::Box)头文件
#include <QPixmap> // QPixmap图片处理头文件
#include <QResizeEvent> // 窗口大小变化事件头文件
// 前提:需在Widget.h的private区域声明以下成员变量,否则编译报错
// public:
// void resizeEvent(QResizeEvent *event); // 重写窗口大小变化事件
// private:
// QLabel* label4; // 用于显示图片的标签
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==================== 设置 Label 的文本格式 ====================
// 创建第一个QLabel标签,指定当前Widget为父对象
QLabel* label1 = new QLabel(this);
// 创建第二个QLabel标签
QLabel* label2 = new QLabel(this);
// 创建第三个QLabel标签
QLabel* label3 = new QLabel(this);
// 设置label1的位置:x=100, y=100
label1->move(100, 100);
// 设置label2的位置:x=100, y=200
label2->move(100, 200);
// 设置label3的位置:x=100, y=300
label3->move(100, 300);
// 设置label1的文本格式为纯文本(默认):不解析任何标记,原样显示文本
label1->setTextFormat(Qt::PlainText);
// 设置label2的文本格式为富文本:解析HTML标记(如<b>加粗、<font>改颜色等)
label2->setTextFormat(Qt::RichText);
// 设置label3的文本格式为Markdown文本:解析Markdown语法(如## 二级标题)
label3->setTextFormat(Qt::MarkdownText);
// 设置label1显示纯文本(无格式)
label1->setText("这是一段纯文本");
// 设置label2显示富文本:<b>标签表示加粗
label2->setText("<b>这是一段富文本</b>");
// 设置label3显示Markdown文本:## 表示二级标题(显示为加粗大号字体)
label3->setText("## 这是一段 markdown 文本");
// ==================== 设置文本对齐/换行/缩进 ====================
// 创建用于测试对齐/换行/缩进的标签
QLabel* label5 = new QLabel(this);
QLabel* label6 = new QLabel(this);
QLabel* label7 = new QLabel(this);
QLabel* label8 = new QLabel(this);
// 设置label5的位置和大小:x=500, y=100, 宽200, 高75
label5->setGeometry(500, 100, 200, 75);
// 设置label5的边框样式为矩形框(方便直观看到标签范围)
label5->setFrameShape(QFrame::Box);
// 设置label5显示的文本内容
label5->setText("居中水平对齐");
// 设置label5的文本对齐方式:水平居中 + 垂直居中(Qt::AlignHCenter/VCenter)
label5->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
// 设置label6的位置和大小:x=500, y=200, 宽200, 高75
label6->setGeometry(500, 200, 200, 75);
// 设置label6的边框样式为矩形框
label6->setFrameShape(QFrame::Box);
// 设置label6显示的文本内容
label6->setText("右上对齐");
// 设置label6的文本对齐方式:水平右对齐 + 垂直顶部对齐
label6->setAlignment(Qt::AlignRight | Qt::AlignTop);
// 设置label7的位置和大小:x=500, y=300, 宽200, 高120
label7->setGeometry(500, 300, 200, 120);
// 设置label7的边框样式为矩形框
label7->setFrameShape(QFrame::Box);
// 设置label7显示超长文本(用于测试换行)
label7->setText("这是一段很长的文本, 这是一段很长的文本, 这是一段很长的文本, 这是一段很长的文本, 这是一段很长的文本");
// 开启自动换行:文本超出标签宽度时自动换行,否则会截断或超出边框
label7->setWordWrap(true);
// 设置label8的位置和大小:x=500, y=450, 宽250, 高75
label8->setGeometry(500, 450, 250, 75);
// 设置label8的边框样式为矩形框
label8->setFrameShape(QFrame::Box);
// 设置label8显示的文本内容
label8->setText("缩进,单位是像素点");
// 设置文本缩进:首行缩进50像素(仅对单行/多行文本的首行生效)
label8->setIndent(50);
// ==================== QLabel 伙伴机制 ====================
// 创建用于伙伴机制的标签
QLabel* label9 = new QLabel(this);
// 创建关联的单选按钮
QRadioButton* button = new QRadioButton(this);
// 设置label9的位置:x=100, y=0
label9->move(100, 0);
// 设置button的位置:x=350, y=0
button->move(350, 0);
// 设置label9的文本:&B表示设置快捷键Alt+B(&后接字符为快捷键)
// 伙伴机制:按下Alt+B时,焦点自动跳转到关联的button控件
label9->setText("点击此文本触发button_b &B");
// 设置单选按钮的显示文本
button->setText("button_b");
// 建立伙伴关系:将label9与button绑定,实现快捷键跳转焦点
label9->setBuddy(button);
// ==================== 显示图片(动态拉伸) ====================
// 创建用于显示图片的标签(成员变量,需在头文件声明)
label4 = new QLabel(this);
// 获取当前窗口的几何尺寸(位置和大小)
QRect windowRect = this->geometry();
// 设置label4初始大小为窗口大小,覆盖整个窗口
label4->setGeometry(0, 0, windowRect.width(), windowRect.height());
// 创建QPixmap对象,加载Qt资源文件中的dog.png图片(":/"为资源前缀)
QPixmap pixmap(":/dog.png");
// 给label4设置要显示的图片
label4->setPixmap(pixmap);
// 开启图片自动拉伸:label4大小变化时,图片会自适应拉伸/压缩填充整个标签
label4->setScaledContents(true);
}
Widget::~Widget()
{
delete ui;
}
// 重写窗口大小变化事件:窗口拉伸/缩小时触发
void Widget::resizeEvent(QResizeEvent *event)
{
// 更新label4的大小为窗口新的尺寸,保证图片始终覆盖整个窗口
label4->setGeometry(0, 0, event->size().width(), event->size().height());
}
setTextFormat 函数解析
setTextFormat 是 QLabel 类的成员函数,核心作用是设置标签文本的解析格式 ,决定 QLabel 如何处理setText()传入的字符串内容,函数原型及调用示例:
// 函数原型
void QLabel::setTextFormat(Qt::TextFormat format);
// 调用示例
label1->setTextFormat(Qt::PlainText);
label2->setTextFormat(Qt::RichText);
label3->setTextFormat(Qt::MarkdownText);
- 函数参数:
Qt::TextFormat枚举类型,指定文本解析规则; - 生效特性:设置后,后续调用
setText()时,文本会按指定格式解析显示,默认值为Qt::AutoText(自动识别纯文本 / 富文本)。
Qt::PlainText 枚举值解析
Qt::PlainText 是Qt::TextFormat枚举的核心取值,代表纯文本格式,代码示例:
label1->setTextFormat(Qt::PlainText);
label1->setText("这是一段纯文本");
- 解析规则:不解析任何标记(如 HTML、Markdown 语法),所有字符原样显示;
- 适用场景:仅需展示无格式文本的场景(如普通提示语、数据展示),是最基础的文本格式。
Qt::RichText 枚举值解析
Qt::RichText 是Qt::TextFormat枚举的取值,代表富文本格式,支持解析 HTML 标记,代码示例:
label2->setTextFormat(Qt::RichText);
label2->setText("<b>这是一段富文本</b>");
- 解析规则:识别并渲染常见 HTML 标记(如
<b>加粗、<font color="red">改颜色、<u>下划线等); - 适用场景:需要展示带样式文本的场景(如高亮提示、彩色文本),扩展了 QLabel 的文本展示能力。
Qt::MarkdownText 枚举值解析
Qt::MarkdownText 是Qt::TextFormat枚举的取值,代表Markdown 文本格式,支持解析 Markdown 语法,代码示例:
label3->setTextFormat(Qt::MarkdownText);
label3->setText("## 这是一段 markdown 文本");
- 解析规则:识别并渲染基础 Markdown 语法(如
##二级标题、**加粗、*斜体等); - 适用场景:需快速实现结构化文本样式的场景(如文档类界面),语法比 HTML 更简洁。
QPixmap 类解析
QPixmap 是 Qt 框架中针对屏幕显示优化的像素图处理类,用于加载、存储、渲染位图图像(支持 png、jpg、ico 等格式),是 QLabel 显示图片的核心依赖类,代码示例:
QPixmap pixmap(":/dog.png");
label4->setPixmap(pixmap);
- 核心特性:
- 资源加载:支持 Qt 资源文件(
:/"前缀)、本地文件路径加载图片; - 显示优化:针对屏幕渲染做了底层优化,比 QImage 更适合 GUI 控件的图片展示;
- 轻量特性:栈上创建即可,无需
new,内部管理图片像素数据。
- 资源加载:支持 Qt 资源文件(
setScaledContents 函数解析
setScaledContents 是 QLabel 类的成员函数,核心作用是开启 / 关闭图片的自动拉伸功能,代码示例:
label4->setScaledContents(true);
- 函数参数:布尔类型(bool),
true开启自动拉伸,false关闭(默认值); - 生效特性:
- 开启后,QLabel 内的图片会自适应标签的大小,拉伸 / 压缩填充整个标签区域;
- 关闭时,图片按原始尺寸显示,超出标签范围的部分会被截断;
- 该设置仅对
setPixmap()设置的图片生效,对文本无影响。
resizeEvent 虚函数解析
resizeEvent 是 QWidget 类提供的窗口大小变化事件虚函数,属于 Qt 事件机制的核心部分,代码示例:
void Widget::resizeEvent(QResizeEvent *event)
{
label4->setGeometry(0, 0, event->size().width(), event->size().height());
}
- 触发条件:窗口被拉伸、缩小、最大化 / 还原时自动触发;
- 重写规则:需在 Widget 类中声明并实现该函数,重写后会覆盖父类的默认实现;
- 核心用途:响应窗口尺寸变化,动态调整控件大小 / 位置(如示例中让图片标签始终覆盖整个窗口)。
QResizeEvent 类解析
QResizeEvent 是 Qt 封装的窗口大小变化事件类 ,作为resizeEvent的参数传递,提供窗口尺寸变化的关键信息,代码示例:
// 获取窗口新尺寸
int newWidth = event->size().width();
int newHeight = event->size().height();
// 获取窗口旧尺寸(可选)
int oldWidth = event->oldSize().width();
- 核心方法:
size():返回窗口变化后的新尺寸(QSize 类型);oldSize():返回窗口变化前的旧尺寸(QSize 类型);
- 内存特性:由 Qt 事件系统自动创建和销毁,无需手动管理内存。
setAlignment 函数解析
setAlignment 是 QLabel 类的成员函数,核心作用是设置标签内文本 / 图片的对齐方式,支持水平 + 垂直方向的组合对齐,函数原型及调用示例:
// 函数原型
void QLabel::setAlignment(Qt::Alignment alignment);
// 调用示例
label5->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
label6->setAlignment(Qt::AlignRight | Qt::AlignTop);
- 函数参数:
Qt::Alignment枚举类型,可通过|组合水平、垂直对齐方式; - 生效特性:对齐方式针对标签的整个显示区域,文本 / 图片会按指定规则排列。
Qt::AlignHCenter 等枚举值解析
Qt::AlignHCenter /Qt::AlignRight /Qt::AlignTop /Qt::AlignVCenter 均为Qt::Alignment枚举的核心取值,用于定义对齐方向,代码示例及含义:
// 水平居中 + 垂直居中
label5->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
// 水平右对齐 + 垂直顶部对齐
label6->setAlignment(Qt::AlignRight | Qt::AlignTop);
- 水平方向枚举:
Qt::AlignLeft:水平左对齐(默认值);Qt::AlignHCenter:水平居中;Qt::AlignRight:水平右对齐;
- 垂直方向枚举:
Qt::AlignTop:垂直顶部对齐;Qt::AlignVCenter:垂直居中;Qt::AlignBottom:垂直底部对齐;
- 组合规则:通过
|运算符组合水平、垂直方向,实现精准对齐。
setWordWrap 函数解析
setWordWrap 是 QLabel 类的成员函数,核心作用是开启 / 关闭文本自动换行功能,代码示例:
label7->setWordWrap(true);
- 函数参数:布尔类型(bool),
true开启自动换行,false关闭(默认值); - 生效特性:
- 开启后,文本超出标签宽度时自动换行,避免文本截断或超出标签边框;
- 关闭时,文本单行显示,超出宽度的部分会被截断(或显示为省略号,需额外设置);
- 仅对文本生效,对图片无影响。
setIndent 函数解析
setIndent 是 QLabel 类的成员函数,核心作用是设置文本的首行缩进值,代码示例:
label8->setIndent(50);
- 函数参数:整型(int),单位为像素,示例中 50 表示首行缩进 50 像素;
- 生效特性:
- 仅对文本的首行生效,多行文本的后续行无缩进;
- 缩进方向为水平方向(从左向右缩进);
- 对图片无生效,仅针对文本内容。
setBuddy 伙伴机制解析
setBuddy 是 QLabel 类的成员函数,核心作用是建立标签与控件的伙伴关系,实现快捷键跳转焦点的功能,代码示例:
label9->setText("点击此文本触发button_b &B");
label9->setBuddy(button);
- 核心规则:
- 快捷键定义:标签文本中
&后接的字符(示例中为 B),对应快捷键Alt+B; - 触发效果:按下
Alt+B时,焦点会自动跳转到绑定的 button 控件,但不会直接选中按钮,仅将输入焦点移至该控件; - 关键限制:伙伴机制仅实现焦点跳转,无法通过
Alt+B直接选中单选按钮,若需选中需额外绑定快捷键触发setChecked(true); - 适用控件:仅对可获取焦点的控件(如 QRadioButton、QLineEdit、QPushButton)生效。
- 快捷键定义:标签文本中
总结
- setTextFormat 设置文本解析格式,包含 PlainText(纯文本)、RichText(HTML)、MarkdownText(Markdown)三种核心类型;
- QPixmap 用于加载图片,setScaledContents 开启图片自动拉伸,resizeEvent(结合 QResizeEvent)响应窗口尺寸变化;
- setAlignment 定义文本 / 图片对齐方式(AlignHCenter 等枚举),setWordWrap 开启文本换行,setIndent 设置首行缩进;
- setBuddy 伙伴机制通过 Alt+& 后字符实现焦点跳转,仅移动焦点而非直接选中控件。
QWidget 核心控件之 LCD Number(计算器)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLCDNumber> // QLCDNumber数字显示控件头文件(补充:必须包含)
#include <QTimer> // QTimer定时器类头文件(补充:必须包含)
// 前提:需在Widget类的private区域声明以下成员变量/槽函数,否则编译报错
// private:
// QTimer* timer; // 定时器对象,用于定时触发倒计时
// QLCDNumber* lcdNumber; // LCD样式的数字显示控件,展示倒计时数值
// private slots:
// void handle(); // 定时器超时触发的槽函数,处理倒计时逻辑
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==================== 利用 QLCDNumber 实现倒计时 ====================
// 创建QTimer定时器对象,指定当前Widget为父对象(Qt自动管理内存)
// QTimer核心作用:按指定时间间隔触发timeout信号,实现定时操作
timer = new QTimer(this);
// 创建QLCDNumber数字显示控件,指定当前Widget为父对象
// QLCDNumber以LCD液晶屏样式显示数字,适合倒计时、计数器等场景
lcdNumber = new QLCDNumber(this);
// 设置QLCDNumber的位置和大小:x=100, y=100, 宽度500, 高度100
lcdNumber->setGeometry(100, 100, 500, 100);
// 设置QLCDNumber的初始显示数值为10(倒计时从10开始)
lcdNumber->display(10);
// 关联定时器的timeout信号到自定义槽函数handle
// 定时器每触发一次timeout信号,就执行一次handle函数,实现每秒减1
connect(timer, &QTimer::timeout, this, &Widget::handle);
// 启动定时器,设置定时间隔为1000毫秒(1秒)
// start(ms):定时器开始工作,每隔指定毫秒触发一次timeout信号
timer->start(1000);
}
Widget::~Widget()
{
delete ui;
}
// 定时器timeout信号触发的槽函数:处理倒计时核心逻辑
void Widget::handle()
{
// 获取QLCDNumber当前显示的整数值(如初始值10)
int value = lcdNumber->intValue();
// 倒计时终止条件:数值≤0时停止定时器,结束倒计时
if(value <= 0)
{
timer->stop(); // 停止定时器,不再触发timeout信号
return; // 退出槽函数,避免数值继续减少
}
// 倒计时逻辑:将当前数值减1后,更新QLCDNumber的显示
lcdNumber->display(value - 1);
}
QTimer 类解析
QTimer 是 Qt 框架中实现定时触发操作的核心类,基于 Qt 事件循环机制工作,无需阻塞主线程,是 GUI 程序中实现 "每隔一段时间执行某操作" 的标准方案,代码示例:
timer = new QTimer(this); // 创建定时器,父对象管理内存
- 核心能力:按指定时间间隔触发
timeout信号,绑定槽函数后可实现定时逻辑(如倒计时、轮询); - 内存特性:创建时指定父对象(
this),Qt 对象树自动管理内存,无需手动delete; - 关键优势:事件驱动型定时器,不会阻塞 GUI 界面的响应(区别于
sleep()等阻塞式延时)。
QLCDNumber 类解析
QLCDNumber 是 Qt 框架中以LCD 液晶屏样式显示数字的纯展示型控件,继承自 QWidget,视觉上模拟传统 LCD 屏的数字显示效果,代码示例:
lcdNumber = new QLCDNumber(this);
lcdNumber->setGeometry(100, 100, 500, 100);
- 核心特性:
- 仅支持数字显示(整数 / 浮点数),无法接收输入,适合倒计时、计数器、时钟等数字展示场景;
- 可通过
setGeometry设置位置和大小,显示样式固定为 LCD 风格,无需额外美化; - 支持多位数显示,超出位数时会自动截断或显示省略号(默认适配数字长度)。
display 函数解析
display 是 QLCDNumber 类的核心成员函数,作用是设置 QLCDNumber 要显示的数字,代码示例:
lcdNumber->display(10); // 初始显示10
lcdNumber->display(value - 1); // 显示减1后的数值
- 函数参数:支持
int、double、QString等类型,示例中使用int类型适配倒计时场景; - 生效特性:调用后立即更新控件显示,是 QLCDNumber 唯一的数字设置接口,无其他替代方式。
&QTimer::timeout 信号解析
timeout 是 QTimer 类的核心信号,触发时机为定时器启动后,每到达指定时间间隔,代码示例:
connect(timer, &QTimer::timeout, this, &Widget::handle);
- 触发规则:示例中定时器间隔为 1000 毫秒,因此每 1 秒触发一次
timeout信号; - 绑定逻辑:通过
connect绑定到槽函数handle,信号触发时自动执行槽函数,实现 "每秒执行一次倒计时" 的核心逻辑; - 特性:仅定时器启动(
start)后才会触发,停止(stop)后立即终止触发。
start 函数解析
start 是 QTimer 类的成员函数,作用是启动定时器并设置触发间隔,代码示例:
timer->start(1000); // 间隔1000毫秒(1秒)
- 函数参数:整型(int),单位为毫秒(ms) ,示例中 1000 表示每隔 1 秒触发一次
timeout信号; - 生效特性:
- 启动后定时器持续工作,直到调用
stop()或定时器对象被销毁; - 重复调用
start()会重置定时器,以新的间隔重新计时。
- 启动后定时器持续工作,直到调用
intValue 函数解析
intValue 是 QLCDNumber 类的成员函数,作用是获取当前显示的数字并转换为 int 类型返回,代码示例:
int value = lcdNumber->intValue();
- 返回值:QLCDNumber 当前显示的整数值(如显示 10 返回 10,显示 5 返回 5);
- 补充特性:
- 若控件显示浮点数,可使用
value()函数获取double类型值; - 仅读取显示值,不会修改控件状态,也不会触发任何信号。
- 若控件显示浮点数,可使用
stop 函数解析
stop 是 QTimer 类的成员函数,作用是停止定时器,终止 timeout 信号触发,代码示例:
timer->stop(); // 数值≤0时停止倒计时
- 生效特性:
- 调用后定时器立即停止工作,不再触发
timeout信号,倒计时终止; - 停止后可再次调用
start()重启定时器,无需重新创建 QTimer 对象; - 仅停止定时触发,不会销毁定时器对象,内存仍由父对象管理。
- 调用后定时器立即停止工作,不再触发
总结
- QTimer 是 Qt 定时触发工具,通过 timeout 信号实现定时操作,start (ms) 启动定时器,stop () 停止;
- QLCDNumber 是 LCD 样式数字显示控件,display () 设置显示值,intValue () 获取当前显示的整数值;
- 倒计时核心逻辑:定时器每秒触发 timeout 信号→槽函数读取当前数值→减 1 后更新显示→数值≤0 时停止定时器。
QWidget 核心控件之 ProgressBar(进度条)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // QTimer定时器类头文件(定时触发进度条更新)
#include <QProgressBar> // QProgressBar进度条控件头文件(核心)
// 前提:需在Widget类的private区域声明以下成员变量/槽函数,否则编译报错
// private:
// QTimer* timer; // 定时器对象,用于定时触发进度条更新
// QProgressBar* progressBar; // 进度条控件,展示进度百分比
// private slots:
// void handle(); // 定时器超时触发的槽函数,更新进度条数值
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==================== 模拟进度条前进 ====================
// 创建QTimer定时器对象,指定当前Widget为父对象(Qt自动管理内存)
// 作用:按固定时间间隔触发timeout信号,驱动进度条逐步增加
timer = new QTimer(this);
// 创建QProgressBar进度条控件,指定当前Widget为父对象
// QProgressBar用于可视化展示任务进度(0-100为默认百分比范围)
progressBar = new QProgressBar(this);
// 设置进度条在窗口中的位置:x=100, y=100(仅设置位置,大小使用默认)
progressBar->move(100, 100);
// 初始化进度条数值为0(进度从0%开始)
progressBar->setValue(0);
// 关联定时器的timeout信号到自定义槽函数handle
// 定时器每触发一次timeout,就执行一次handle,让进度条数值+1
connect(timer, &QTimer::timeout, this, &Widget::handle);
// 启动定时器,设置定时间隔为100毫秒(0.1秒)
// 间隔越小,进度条前进越流畅;本例100ms触发一次,100次(10秒)可到100%
timer->start(100);
}
Widget::~Widget()
{
delete ui;
}
// 定时器timeout信号触发的槽函数:更新进度条核心逻辑
void Widget::handle()
{
// 获取进度条当前的数值(范围0-100,对应百分比)
int value = progressBar->value();
// 进度条终止条件:数值≥100(100%)时停止定时器,结束进度更新
if(value >= 100)
{
timer->stop(); // 停止定时器,不再触发timeout信号
return; // 退出槽函数,避免数值继续增加
}
// 进度条前进逻辑:数值自增1后,更新到进度条显示
// ++value:先自增再赋值,等价于 value = value + 1; progressBar->setValue(value);
progressBar->setValue(++value);
}
QProgressBar 类解析
QProgressBar 是 Qt 框架中专门用于可视化展示任务进度的核心控件类,继承自 QWidget,是 GUI 界面中直观呈现 "加载、下载、处理任务进度" 的标准组件,代码示例:
progressBar = new QProgressBar(this);
progressBar->move(100, 100);
progressBar->setValue(0);
- 核心特性:
- 进度范围:默认进度值范围为
0-100(对应百分比,0=0%、100=100%),也可通过setRange(min, max)自定义范围(如setRange(0, 200)表示进度值到 200 时完成); - 视觉表现:控件以 "空条 + 填充条" 的样式显示,填充部分的宽度随数值增加而扩展,直观反映进度占比;
- 内存管理:创建时指定父对象为当前 Widget(
this),Qt 对象树机制自动管理内存,无需手动delete; - 交互特性:默认仅用于展示进度,无输入功能,常结合定时器 / 后台任务动态更新数值。
- 进度范围:默认进度值范围为
setValue 函数解析
setValue 是 QProgressBar 的核心成员函数,作用是设置进度条当前显示的进度数值,代码示例:
progressBar->setValue(0); // 初始化进度为0%
progressBar->setValue(++value); // 进度值自增1后更新显示
- 函数参数:整型(int),即要设置的进度值;
- 生效规则:
- 若参数超出进度条的默认范围(0-100),会自动截断(如传入 101 则按 100 显示,传入 - 1 则按 0 显示);
- 调用后立即更新进度条的视觉填充效果,数值对应的占比会实时反映在控件上(如值为 50 时,进度条填充 50%);
- 是修改进度条显示状态的唯一核心接口,无其他替代方式。
value 函数解析
value 是 QProgressBar 的成员函数,作用是获取进度条当前的进度数值,代码示例:
int value = progressBar->value(); // 读取当前进度值
- 返回值:整型(int),返回进度条当前的数值(默认范围 0-100);
- 核心用途:
- 在逻辑中判断进度状态(如示例中判断
value >= 100,即进度是否达到 100%); - 作为进度更新的 "基准值",比如示例中基于当前值自增 1,实现进度条逐步前进;
- 仅读取数值,不会修改进度条状态,也不会触发任何信号。
- 在逻辑中判断进度状态(如示例中判断
总结
- QProgressBar 是 Qt 可视化展示进度的核心控件,默认进度范围 0-100(百分比),视觉上以填充条反映进度占比;
- setValue 用于设置进度条的当前数值,参数超出范围会自动截断,调用后立即更新视觉效果;
- value 用于读取进度条当前数值,是判断进度状态、实现进度递增的核心读取接口。
QWidget 核心控件之 Calendar Widget(日历)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDate> // QDate日期类头文件:用于处理日期数据(获取、格式化等)
// 前提:widget.ui中已通过Qt Designer拖拽创建了2个控件:
// 1. QCalendarWidget:对象名设为calendarWidget(日历选择控件,用于可视化选择日期)
// 2. QLabel:对象名设为label(用于显示选中的日期文本)
// 槽函数on_calendarWidget_selectionChanged()由Qt自动关联(命名规则:on_<控件对象名>_<信号名>),无需手动connect
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有通过Qt Designer拖拽到widget.ui中的控件
// 执行此函数后,ui->calendarWidget、ui->label等拖拽创建的控件才可用
ui->setupUi(this);
}
Widget::~Widget()
{
// 自动释放所有拖拽创建的控件资源(包括calendarWidget、label等),无需手动delete
delete ui;
}
// 自动关联的槽函数:当拖拽创建的calendarWidget控件的选中日期发生变化时触发
// 对应信号:QCalendarWidget::selectionChanged()(日期选择变化时发出)
void Widget::on_calendarWidget_selectionChanged()
{
// 获取拖拽创建的calendarWidget当前选中的日期
// selectedDate():返回QDate类型的选中日期(包含年、月、日信息)
QDate date = ui->calendarWidget->selectedDate();
// 将选中的日期转换为字符串格式,并设置到拖拽创建的label控件上显示
// toString():默认将QDate转换为"yyyy-MM-dd"格式的字符串(如"2026-03-20"),也可自定义格式(如date.toString("yyyy年MM月dd日"))
ui->label->setText(date.toString());
}

QDate 类解析
QDate 是 Qt 框架中专门用于封装和处理日期数据的核心值类型类(非控件类),仅负责管理 "年、月、日" 相关数据,不涉及可视化展示,是 Qt 中处理日期的基础工具类,代码示例:
QDate date = ui->calendarWidget->selectedDate(); // 获取选中的日期数据
ui->label->setText(date.toString()); // 转换为字符串显示
- 核心特性:
- 数据封装:仅存储年、月、日三个整型数据,是轻量级值类型对象,栈上创建即可(无需
new); - 核心能力:支持日期格式化(
toString())、获取当前系统日期(QDate::currentDate())、日期计算(如addDays(7)加 7 天)、日期有效性判断(isValid())等; - 无界面特性:仅处理日期数据,本身无可视化界面,需结合控件(如 QCalendarWidget、QLabel)实现日期的选择 / 展示。
- 数据封装:仅存储年、月、日三个整型数据,是轻量级值类型对象,栈上创建即可(无需
QCalendarWidget 类解析
QCalendarWidget 是 Qt 框架中提供图形化日历选择界面的交互型控件类,继承自 QWidget,是 GUI 中让用户可视化选择日期的标准组件,代码示例:
// 无需手动创建,由Qt Designer拖拽生成,通过ui->calendarWidget访问
ui->calendarWidget; // 可视化日历控件,显示月份/日期,支持鼠标点击选择
- 核心特性:
- 可视化界面:默认显示当前月份的日历网格(日期数字、星期标识),支持切换月份 / 年份,用户可直接点击日期完成选择;
- UI 创建方式:示例中通过 Qt Designer 拖拽创建(对象名设为
calendarWidget),无需手动new,ui->setupUi(this)初始化后即可使用; - 交互联动:选中日期变化时会触发
selectionChanged信号,绑定槽函数后可实时响应日期选择操作。
selectedDate 函数解析
selectedDate 是 QCalendarWidget 的核心成员函数,作用是获取日历控件当前选中的日期,代码示例:
QDate date = ui->calendarWidget->selectedDate();
- 返回值:
QDate类型对象,包含当前选中日期的年、月、日完整信息; - 调用特性:
- 无参数,仅读取当前选中状态,不会修改控件的选择结果;
- 初始状态:默认选中当前系统日期,用户点击其他日期后,返回值会更新为新选中的日期;
- 核心用途:将日历控件的 "可视化选择结果" 转换为 QDate 数据,便于后续处理(如格式化显示、日期计算)。
selectionChanged 信号解析
selectionChanged 是 QCalendarWidget 的核心信号,触发时机为日历控件的选中日期发生变化时,代码示例:
// 自动关联槽函数(命名规则:on_<控件对象名>_<信号名>)
void Widget::on_calendarWidget_selectionChanged()
- 触发条件:
- 用户鼠标点击日历中的不同日期(选中日期改变);
- 代码调用
setSelectedDate()修改选中日期(如ui->calendarWidget->setSelectedDate(QDate(2026, 3, 20)));
- 信号特性:
- 无参数,仅通知 "选中日期变了",需通过
selectedDate()主动获取新日期; - 自动关联:示例中未手动调用
connect,是因为遵循 Qt 的 "自动关联槽函数" 规则 ------ 槽函数命名为on_控件对象名_信号名,Qt 会自动完成信号槽绑定; - 核心作用:实现 "选中日期变化→实时更新展示" 的联动逻辑(如示例中更新 Label 显示选中的日期)。
- 无参数,仅通知 "选中日期变了",需通过
总结
- QDate 是处理日期数据的轻量级类,封装年 / 月 / 日,支持格式化和日期计算,无可视化界面;
- QCalendarWidget 是图形化日历选择控件,提供可视化日期选择界面,支持鼠标交互;
- selectedDate 用于获取日历当前选中的日期(返回 QDate),selectionChanged 在选中日期变化时触发,实现交互联动。
QWidget 核心控件之 Line Edit(单行输入框)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug> // Qt调试输出头文件(qDebug()打印数据)
#include <QRegExpValidator> // 正则表达式验证器头文件:用于限制输入框的输入格式
#include <QRegExp> // QRegExp正则表达式类头文件(补充:使用正则必须包含)
#include <QLineEdit> // QLineEdit单行输入框头文件(补充:核心控件头文件)
// 前提:widget.ui中已通过Qt Designer拖拽创建以下控件:
// 1. QLineEdit:对象名分别为lineEdit_name(姓名输入框)、lineEdit_password(密码输入框)、lineEdit_number(手机号输入框)
// 2. QPushButton:对象名pushButton(提交按钮)
// 槽函数on_pushButton_clicked()、on_lineEdit_number_textEdited()由Qt自动关联(命名规则:on_<控件对象名>_<信号名>)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有通过Qt Designer拖拽创建的控件,执行后可通过ui->访问所有拖拽控件
ui->setupUi(this);
// ==================== lineEdit基本使用 ====================
// 配置姓名输入框(拖拽创建,objectName=lineEdit_name)
// 设置占位提示文本:输入框为空时显示的灰色提示文字
ui->lineEdit_name->setPlaceholderText("请输入姓名");
// 启用清除按钮:输入框有内容时右侧显示×按钮,点击可一键清空内容(提升交互体验)
ui->lineEdit_name->setClearButtonEnabled(true);
// 配置密码输入框(拖拽创建,objectName=lineEdit_password)
ui->lineEdit_password->setPlaceholderText("请输入密码");
ui->lineEdit_password->setClearButtonEnabled(true);
// 设置密码回显模式:输入的字符会被隐藏(显示为圆点/星号),保护密码隐私
// QLineEdit::Password是默认的密码隐藏模式,其他模式如PasswordEchoOnEdit(输入时显示,失去焦点隐藏)
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
// 配置手机号输入框(拖拽创建,objectName=lineEdit_number)
ui->lineEdit_number->setPlaceholderText("请输入手机号码");
ui->lineEdit_number->setClearButtonEnabled(true);
// ==================== 正则表达式简单验证电话号码 ====================
// 初始禁用提交按钮:仅当手机号输入格式正确时才启用
ui->pushButton->setEnabled(false);
// 定义手机号正则表达式:
// ^1:以数字1开头(手机号段特征);\\d{11}:紧跟11位数字;$:匹配字符串结束
// 注:实际手机号正则应为^1\\d{10}$(11位总长度),本例代码中写的{11}是笔误,总长度会变成12位,注释中会标注
QRegExp regexp("^1\\d{11}$");
// 给手机号输入框设置正则验证器:限制输入内容必须符合上述正则规则
// QRegExpValidator会实时校验输入内容,不符合规则的字符无法输入
ui->lineEdit_number->setValidator(new QRegExpValidator(regexp));
}
Widget::~Widget()
{
// 自动释放所有拖拽创建的控件资源,无需手动delete单个控件
delete ui;
}
// 自动关联的槽函数:点击拖拽创建的pushButton按钮时触发
void Widget::on_pushButton_clicked()
{
// 打印三个输入框的内容:
// text():获取QLineEdit的输入文本(返回QString类型)
qDebug() << "姓名: " << ui->lineEdit_name->text()
<< "密码: " << ui->lineEdit_password->text()
<< "电话: " << ui->lineEdit_number->text();
}
// 自动关联的槽函数:拖拽创建的lineEdit_number输入框文本被编辑时触发
// 参数text:输入框当前的文本内容(实时更新)
void Widget::on_lineEdit_number_textEdited(const QString &text)
{
// 拷贝当前输入文本(用于验证,避免修改原文本)
QString content = text;
// 验证位置参数:0表示从文本起始位置开始验证(固定传0即可)
int pos = 0;
// 调用输入框的验证器(正则验证器)校验当前文本:
// validate()返回值:
// - QValidator::Acceptable:文本完全符合正则规则(手机号格式正确)
// - QValidator::Intermediate:文本部分符合(如输入了138,还未输完11位)
// - QValidator::Invalid:文本完全不符合(如以0开头)
if(ui->lineEdit_number->validator()->validate(content, pos) == QValidator::Acceptable)
{
// 手机号格式正确:启用提交按钮
ui->pushButton->setEnabled(true);
}
else
{
// 手机号格式不正确/未输完:禁用提交按钮
ui->pushButton->setEnabled(false);
}
}
QLineEdit 类解析
QLineEdit 是 Qt 框架中用于单行文本输入 / 编辑 的核心交互控件类,继承自 QWidget,是 GUI 界面中接收用户单行文本输入(如姓名、密码、手机号)的标准组件,代码示例中通过 Qt Designer 拖拽创建(对象名如lineEdit_name),无需手动new,ui->setupUi(this)初始化后可直接通过ui->访问。
- 核心特性:
- 基础输入:支持普通文本输入、复制粘贴、全选等基础文本操作;
- 交互增强:可设置占位提示、清除按钮、密码隐藏、输入格式验证等;
- 信号丰富:提供
textEdited(文本编辑时)、textChanged(文本变化时)、returnPressed(按回车时)等信号,适配不同交互场景。
setPlaceholderText 函数解析
setPlaceholderText 是 QLineEdit 的成员函数,核心作用是设置输入框的占位提示文本,代码示例:
ui->lineEdit_name->setPlaceholderText("请输入姓名");
- 函数参数:字符串类型(QString/const char*),即提示用户输入内容的文本;
- 显示效果:输入框为空时,文本以浅灰色显示在输入框内;用户开始输入内容后,提示文本自动消失;
- 核心价值:引导用户输入正确内容(如 "请输入手机号码"),提升界面易用性,无输入时不占用有效显示空间。
setEchoMode (QLineEdit::Password) 函数解析
setEchoMode 是 QLineEdit 的成员函数,作用是设置输入文本的回显模式 (即输入的字符如何显示),QLineEdit::Password是最常用的密码隐藏模式,代码示例:
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
QLineEdit::Password模式特性:- 用户输入的所有字符都会被隐藏,显示为圆点(・)或星号(*)(取决于系统样式);
- 仅隐藏视觉显示,
text()函数仍能获取真实输入的密码文本;
- 其他常用模式(补充):
QLineEdit::Normal:默认模式,输入什么显示什么(如姓名 / 手机号输入框);QLineEdit::PasswordEchoOnEdit:输入时显示字符,失去焦点后隐藏(兼顾输入校对和隐私)。
setEnabled 函数解析
setEnabled 是 QWidget 类的通用成员函数,作用是控制控件是否启用(可交互),代码示例:
ui->pushButton->setEnabled(false); // 禁用按钮(初始状态)
ui->pushButton->setEnabled(true); // 启用按钮(手机号格式正确时)
- 函数参数:布尔类型(bool),
true为启用(控件正常显示、可点击 / 输入),false为禁用; - 禁用效果:
- 控件视觉上灰显(颜色变浅),无法响应鼠标点击、键盘输入等交互操作;
- 示例中用于 "仅手机号格式正确时才能点击提交按钮",避免无效提交。
QRegExp 类 + 正则表达式解析
正则表达式(基础概念)
正则表达式是用于匹配字符串格式的规则表达式,可精准限制输入内容的格式(如手机号必须以 1 开头、共 11 位数字),是文本格式校验的核心工具。
QRegExp 类
QRegExp是 Qt 框架中封装正则表达式规则的类,用于定义匹配规则,代码示例:
QRegExp regexp("^1\\d{11}$"); // 注:实际正确手机号应为^1\\d{10}$(总11位),示例中{11}是笔误
- 示例正则规则拆解:
^:匹配字符串的起始位置(确保手机号以指定字符开头);1:匹配数字 1(手机号段必须以 1 开头);\\d:匹配任意单个数字(等价于 0-9);{11}:表示前面的\\d需连续匹配 11 次(示例笔误,正确应为 {10},总长度 1+10=11 位);$:匹配字符串的结束位置(确保字符串无多余字符);
- 核心特性:QRegExp 封装了正则语法,可结合
QRegExpValidator实现输入框的实时格式限制。
setValidator (new QRegExpValidator (regexp)) 函数解析
setValidator 是 QLineEdit 的成员函数,作用是为输入框设置输入验证器 ,QRegExpValidator是基于正则规则的验证器,代码示例:
ui->lineEdit_number->setValidator(new QRegExpValidator(regexp));
- 核心作用:
- 实时限制输入:用户输入的字符若不符合正则规则,会被直接过滤(无法输入);例如输入字母、以 0 开头的数字,输入框不会接收;
- 仅允许合法字符:示例中仅允许输入以 1 开头的数字,其他字符无法输入,从源头保证输入格式合规;
- 内存说明:
new QRegExpValidator(regexp)创建的验证器对象,会被 QLineEdit 自动接管内存,无需手动delete。
textEdited 信号解析
textEdited 是 QLineEdit 的核心信号,触发时机为用户手动编辑输入框文本时,代码示例:
void Widget::on_lineEdit_number_textEdited(const QString &text)
- 触发条件:仅用户通过键盘输入、删除字符时触发;代码调用
setText()修改文本不会触发(区别于textChanged信号); - 信号参数:
const QString &text,表示输入框当前的完整文本内容(实时更新); - 核心用途:示例中用于 "实时校验手机号输入格式",每输入 / 删除一个字符就判断格式是否正确,动态启用 / 禁用提交按钮。
validator 函数 + validate 函数解析
validator 函数
validator 是 QLineEdit 的成员函数,作用是获取输入框已设置的验证器对象 ,返回值为QValidator*(基类指针,实际指向QRegExpValidator),代码示例:
ui->lineEdit_number->validator() // 获取手机号输入框的正则验证器
- 核心用途:获取验证器后,可调用其
validate函数主动校验文本格式。
validate 函数
validate 是 QValidator 类的纯虚函数(QRegExpValidator实现了该函数),作用是校验指定文本是否符合验证器规则,代码示例:
ui->lineEdit_number->validator()->validate(content, pos)
- 函数参数:
QString &content:待校验的文本(示例中为手机号输入框的当前文本);int &pos:校验的起始位置(通常传 0,表示从文本开头校验);
- 返回值(QValidator::State 枚举):
QValidator::Acceptable:文本完全符合规则(示例中为手机号格式正确,11 位以 1 开头的数字);QValidator::Intermediate:文本部分符合(如输入了 138,还未输完 11 位);QValidator::Invalid:文本完全不符合(如以 0 开头、包含字母);
- 示例逻辑:仅返回
Acceptable时,才启用提交按钮,确保只有格式正确的手机号能提交。
总结
- QLineEdit 是单行文本输入控件,setPlaceholderText 设占位提示,setEchoMode (Password) 隐藏密码输入;
- QRegExp 封装正则规则,setValidator 结合 QRegExpValidator 可实时限制输入框格式;
- textEdited 信号响应用户手动编辑,validate 函数校验文本格式,setEnabled 控制按钮是否可用,共同实现 "手机号格式校验 + 提交按钮联动"。
QWidget 核心控件之 Text Edit(多行输入框)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug> // Qt调试输出头文件(qDebug()打印信息)
#include <QTextEdit> // QTextEdit多行文本编辑控件头文件(核心)
#include <QTextCursor> // QTextCursor文本光标类头文件:用于操作光标/选中文本
// 前提:widget.ui中已通过Qt Designer拖拽创建以下控件:
// 1. QTextEdit:对象名textEdit(多行文本编辑框,支持换行、格式编辑等)
// 2. QLabel:对象名label(用于实时显示textEdit的输入文本)
// 所有槽函数均遵循Qt自动关联规则(on_<控件对象名>_<信号名>),无需手动connect
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有通过Qt Designer拖拽创建的控件,执行后可通过ui->访问textEdit、label等控件
ui->setupUi(this);
}
Widget::~Widget()
{
// 自动释放所有拖拽创建的控件资源(textEdit、label等),无需手动delete
delete ui;
}
// ==================== textEdit的字符实时输出到label中 ====================
// 自动关联的槽函数:当拖拽创建的textEdit控件文本内容发生变化时触发
// 对应信号:QTextEdit::textChanged()(输入/删除字符、粘贴/清空文本时均会触发)
void Widget::on_textEdit_textChanged()
{
// 获取textEdit的纯文本内容(忽略所有格式,仅返回文本字符串)
// toPlainText():区别于toHtml()(返回带HTML格式的文本),适合纯文本场景
const QString& text = ui->textEdit->toPlainText();
// 将获取的纯文本实时设置到拖拽创建的label控件上显示
ui->label->setText(text);
}
// ==================== 使用textEdit的其他信号 ====================
// 自动关联的槽函数:当textEdit的选中文本范围发生变化时触发
// 触发场景:鼠标选中/取消选中文本、通过代码修改选中文本范围等
void Widget::on_textEdit_selectionChanged()
{
// 获取textEdit当前的文本光标对象(代表光标位置、选中文本范围等信息)
QTextCursor cursor = ui->textEdit->textCursor();
// 打印选中的文本内容:selectedText()返回选中文本的字符串(无选中则返回空)
qDebug() << "selectionChanged: " << cursor.selectedText();
}
// 自动关联的槽函数:当textEdit的光标位置发生变化时触发
// 触发场景:鼠标点击文本不同位置、键盘方向键移动光标、删除/输入字符改变光标位置等
void Widget::on_textEdit_cursorPositionChanged()
{
// 获取textEdit当前的文本光标对象
QTextCursor cursor = ui->textEdit->textCursor();
// 打印光标位置:position()返回光标在文本中的绝对位置(从0开始计数,换行符算1个字符)
qDebug() << "cursorPositionChanged: " << cursor.position();
}
// 自动关联的槽函数:当textEdit的"撤销"操作可用状态变化时触发
// 触发场景:输入文本后(撤销可用,b=true)、执行撤销后(撤销不可用,b=false)
void Widget::on_textEdit_undoAvailable(bool b)
{
// b=true:可执行撤销操作(Ctrl+Z);b=false:无操作可撤销
qDebug() << "undoAvailable: " << b;
}
// 自动关联的槽函数:当textEdit的"重做"操作可用状态变化时触发
// 触发场景:执行撤销后(重做可用,b=true)、执行重做后(重做不可用,b=false)
void Widget::on_textEdit_redoAvailable(bool b)
{
// b=true:可执行重做操作(Ctrl+Y);b=false:无操作可重做
qDebug() << "redoAvailable: " << b;
}
// 自动关联的槽函数:当textEdit的"复制"操作可用状态变化时触发
// 触发场景:选中文本后(复制可用,b=true)、取消选中/无文本时(复制不可用,b=false)
void Widget::on_textEdit_copyAvailable(bool b)
{
// b=true:可执行复制操作(Ctrl+C);b=false:无文本可复制
qDebug() << "copyAvailable: " << b;
}
QTextEdit 类解析
QTextEdit 是 Qt 框架中用于多行文本编辑 / 展示 的核心控件类,继承自 QWidget,是 QLineEdit(单行输入)的 "多行升级版",也是 GUI 中处理大段文本(如笔记、编辑框、日志展示)的标准组件,代码中通过 Qt Designer 拖拽创建(对象名textEdit),ui->setupUi(this)初始化后可通过ui->textEdit访问。
- 核心特性:
- 多行支持:天然支持换行输入 / 显示,无需额外配置(区别于 QLineEdit 默认单行);
- 格式兼容:既支持纯文本编辑,也支持富文本(HTML 格式、加粗 / 颜色 / 下划线等);
- 交互能力:内置撤销(Ctrl+Z)、重做(Ctrl+Y)、复制(Ctrl+C)、粘贴等基础文本操作;
- 光标 / 选区:可精准控制文本光标位置、选中文本范围,适配精细化文本操作场景。
textChanged 信号解析
textChanged 是 QTextEdit 的核心信号,触发时机为文本内容发生任何变化时 ,代码示例中绑定到on_textEdit_textChanged()槽函数:
void Widget::on_textEdit_textChanged()
- 触发条件:
- 用户手动输入 / 删除字符、粘贴 / 清空文本;
- 代码调用
setText()/insertPlainText()等修改文本;
- 信号特性:无参数,仅通知 "文本变了",需主动调用
toPlainText()获取最新文本; - 核心用途:示例中实现 "textEdit 内容实时同步到 label 显示",是文本联动展示的常用信号。
toPlainText 函数解析
toPlainText 是 QTextEdit 的成员函数,作用是获取控件中的纯文本内容(忽略所有格式),代码示例:
const QString& text = ui->textEdit->toPlainText();
- 返回值:
QString类型,仅包含文本字符,不包含任何富文本格式(如 HTML 标签、加粗 / 颜色样式); - 对比补充:
toHtml()函数会返回带 HTML 格式的文本(如<b>加粗文本</b>),适合富文本场景; - 核心用途:示例中用于纯文本同步展示,是最常用的文本读取接口。
selectionChanged 信号解析
selectionChanged 是 QTextEdit 的信号,触发时机为选中文本的范围发生变化时 ,代码示例中绑定到on_textEdit_selectionChanged():
void Widget::on_textEdit_selectionChanged()
- 触发条件:
- 用户鼠标拖动选中文本、点击取消选中;
- 代码通过
QTextCursor修改选中文本范围;
- 信号特性:无参数,需通过
textCursor()->selectedText()获取选中的文本; - 核心用途:示例中实时打印选中的文本,适配 "选中文本预览 / 处理" 场景(如复制、替换选中内容)。
QTextCursor 类解析
QTextCursor 是 Qt 框架中封装文本光标 / 选中文本范围的轻量级值类型类(非控件类),相当于 "文本编辑的操作手柄",代码示例:
QTextCursor cursor = ui->textEdit->textCursor();
- 核心能力:
- 光标位置:读取 / 设置光标在文本中的绝对位置;
- 选区管理:读取 / 修改选中文本的范围(起始 / 结束位置);
- 文本操作:插入 / 删除 / 替换光标处的文本,无需直接修改 QTextEdit 的全部内容;
- 特性补充:栈上创建即可(无需
new),获取的是当前光标状态的副本,修改副本不会直接影响控件,需调用setTextCursor()同步。
textCursor 函数解析
textCursor 是 QTextEdit 的成员函数,作用是获取控件当前的文本光标对象,代码示例:
QTextCursor cursor = ui->textEdit->textCursor();
- 返回值:
QTextCursor对象,包含当前光标位置、选中文本范围等信息; - 核心用途:是连接 QTextEdit 和 QTextCursor 的桥梁,所有光标 / 选区操作都需先通过该函数获取光标对象。
selectedText 函数解析
selectedText 是 QTextCursor 的成员函数,作用是获取当前选中的文本内容,代码示例:
qDebug() << "selectionChanged: " << cursor.selectedText();
- 返回值:
QString类型,选中文本则返回对应字符串,无选中则返回空字符串; - 注意事项:仅返回可见的选中文本,若选中范围包含换行符,会一并返回(换行符算 1 个字符)。
cursorPositionChanged 信号解析
cursorPositionChanged 是 QTextEdit 的信号,触发时机为文本光标位置发生变化时 ,代码示例中绑定到on_textEdit_cursorPositionChanged():
void Widget::on_textEdit_cursorPositionChanged()
- 触发条件:
- 用户鼠标点击文本不同位置、按方向键移动光标;
- 输入 / 删除字符导致光标位置自动移动;
- 代码修改光标位置;
- 信号特性:无参数,需通过
textCursor()->position()获取光标位置; - 核心用途:示例中实时打印光标位置,适配 "光标位置提示、定位文本行 / 列" 场景。
position 函数解析
position 是 QTextCursor 的成员函数,作用是获取光标在文本中的绝对位置,代码示例:
qDebug() << "cursorPositionChanged: " << cursor.position();
- 返回值:整型(int),从 0 开始计数(文本第一个字符位置为 0),换行符 (\n) 算 1 个字符 ;示例:文本 "abc\n123" 中,
\n的位置是 3,字符1的位置是 4; - 补充接口:
columnNumber()可获取光标在当前行的列数,blockNumber()可获取光标所在行号(从 0 开始)。
undoAvailable 信号解析
undoAvailable是 QTextEdit 的信号,触发时机为 **"撤销" 操作的可用状态变化时 **,代码示例:
void Widget::on_textEdit_undoAvailable(bool b)
- 信号参数:布尔类型
b,true表示可执行撤销(Ctrl+Z),false表示无可撤销操作; - 触发场景:
- 输入文本后:
b=true(可撤销输入操作); - 执行撤销后:若已撤销所有操作,
b=false;
- 输入文本后:
- 核心用途:可根据该信号启用 / 禁用 "撤销" 按钮,提升界面交互体验。
redoAvailable 信号解析
redoAvailable是 QTextEdit 的信号,触发时机为 **"重做" 操作的可用状态变化时 **,代码示例:
void Widget::on_textEdit_redoAvailable(bool b)
- 信号参数:布尔类型
b,true表示可执行重做(Ctrl+Y),false表示无可重做操作; - 触发场景:
- 执行撤销后:
b=true(可重做被撤销的操作); - 执行重做后:若已重做所有操作,
b=false;
- 执行撤销后:
- 核心用途:可根据该信号启用 / 禁用 "重做" 按钮,适配文本编辑的回滚 / 恢复需求。
copyAvailable 信号解析
copyAvailable是 QTextEdit 的信号,触发时机为 **"复制" 操作的可用状态变化时 **,代码示例:
void Widget::on_textEdit_copyAvailable(bool b)
- 信号参数:布尔类型
b,true表示有选中文本(可执行 Ctrl+C 复制),false表示无选中文本; - 触发场景:
- 选中文本后:
b=true; - 取消选中 / 无文本时:
b=false;
- 选中文本后:
- 核心用途:可根据该信号启用 / 禁用 "复制" 按钮,避免无效的复制操作。
总结
- QTextEdit 是多行文本编辑控件,支持纯文本 / 富文本,内置撤销 / 重做 / 复制等基础操作;
- textChanged 监听文本内容变化,selectionChanged 监听选区变化,cursorPositionChanged 监听光标位置变化;
- QTextCursor 是文本光标 / 选区的操作核心,textCursor () 获取光标对象,position () 读光标位置,selectedText () 读选中文本;
- undoAvailable/redoAvailable/copyAvailable 分别监听撤销 / 重做 / 复制的可用状态,适配交互按钮的动态启用 / 禁用。
QWidget 核心控件之 Combo Box(下拉框)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
// C++ 文件输入输出流头文件,用于读取本地文本文件
#include <fstream>
// 前提:widget.ui中已通过Qt Designer拖拽创建 QComboBox 控件
// 控件对象名:comboBox(拖拽时在属性面板设置的objectName)
// 所有控件通过 ui-> 指针直接访问,无需手动 new 创建
Widget::Widget(QWidget(parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有通过Qt Designer拖拽创建的控件
// 执行后,ui->comboBox 控件正式可用
ui->setupUi(this);
// ==================== addItem的基本使用 ====================
// QComboBox::addItem(QString):向**拖拽创建的下拉框**中添加一个选项
// 作用:手动逐个添加固定的下拉选项
ui->comboBox->addItem("选项1");
ui->comboBox->addItem("选项2");
ui->comboBox->addItem("选项3");
// ==================== 从文件读取数据再addItem ====================
// 创建文件流对象,以只读方式打开指定路径的文本文件
std::fstream file("C:/Users/1/Desktop/config.txt");
// 判断文件是否成功打开
// 如果文件打开失败(路径错误/文件不存在/权限不足),直接退出程序
if(!file.is_open())
exit(-1);
// 定义字符串变量,存储每一行读取的内容
std::string line;
// 循环读取文件中的每一行内容,直到文件末尾
while(std::getline(file, line))
{
// QString::fromStdString(std::string):将C++标准字符串转换为Qt的QString类型
// 转换后,将文件中的每一行文本作为一个选项,添加到下拉框中
ui->comboBox->addItem(QString::fromStdString(line));
}
// 文件读取完毕,关闭文件流,释放文件资源
file.close();
}
Widget::~Widget()
{
// 自动释放所有通过Qt Designer拖拽创建的控件(包含comboBox)
// 无需手动单独释放控件,Qt自动管理内存
delete ui;
}
QComboBox 类
定义 :Qt 框架中的下拉选择框控件 ,用于提供单选选项列表,默认折叠显示,点击展开全部选项,节省界面空间。核心特性:
-
具备单选特性,同一时间仅能选中一个选项
-
支持手动添加选项、文件 / 数据源加载选项、获取选中项、监听选择变化
-
可通过 Qt Designer 拖拽创建,通过
ui->指针访问,也可代码动态创建代码示例:// 初始化Qt Designer拖拽创建的QComboBox控件
ui->setupUi(this);
addItem 函数
函数作用 :向QComboBox 下拉框中添加单个选项 ,是填充下拉选项的核心接口。基础语法:
ui->comboBox->addItem("选项文本");
参数说明:
-
参数为QString类型,代表下拉框中显示的选项文本
-
不支持直接传入
std::string,需通过QString::fromStdString()转换使用场景 1:手动添加固定选项// 逐一向下拉框添加固定文本选项
ui->comboBox->addItem("选项1");
ui->comboBox->addItem("选项2");
ui->comboBox->addItem("选项3");
使用场景 2:从文件读取内容批量添加选项
// 读取文件每行内容,转换格式后添加为下拉选项
std::string line;
while(std::getline(file, line))
{
ui->comboBox->addItem(QString::fromStdString(line));
}
执行规则:
- 按照调用顺序排序选项,先添加的选项位于列表上方
- 单次调用添加一个选项,循环调用可实现批量添加
- 无选项数量限制,适配各类单选场景
QWidget 核心控件之 Slider(滑动条)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
// Qt快捷键头文件:用于实现键盘快捷键绑定功能
#include <QShortcut>
// 前提:
// 1. widget.ui中已通过Qt Designer拖拽创建两个控件:
// - QSlider(水平滑块):对象名 horizontalSlider
// - QLabel(文本标签):对象名 label
// 2. 类中已声明槽函数:subvalue()、addvalue()
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有通过Qt Designer拖拽创建的控件
// 执行后,ui->horizontalSlider、ui->label 方可正常使用
ui->setupUi(this);
// ==================== 创建并绑定键盘快捷键 ====================
// 创建快捷键对象1,指定父对象为当前窗口(自动管理内存)
QShortcut* shortcut1 = new QShortcut(this);
// 设置快捷键1为 键盘减号键【-】
shortcut1->setKey(QKeySequence("-"));
// 创建快捷键对象2
QShortcut* shortcut2 = new QShortcut(this);
// 设置快捷键2为 键盘等号键【=】(大部分键盘+和=同键)
shortcut2->setKey(QKeySequence("="));
// 信号槽连接:
// 按下快捷键【-】→ 触发 subvalue() 槽函数(数值减5)
connect(shortcut1, &QShortcut::activated, this, &Widget::subvalue);
// 按下快捷键【=】→ 触发 addvalue() 槽函数(数值加5)
connect(shortcut2, &QShortcut::activated, this, &Widget::addvalue);
}
Widget::~Widget()
{
// 自动释放所有拖拽创建的控件 + 快捷键对象(Qt父子对象机制)
delete ui;
}
// 快捷键【-】触发的槽函数:滑块数值减5
void Widget::subvalue()
{
// 获取拖拽创建的水平滑块当前的数值
int value = ui->horizontalSlider->value();
// 边界判断:如果当前值等于滑块最小值,直接返回,不做修改
if(value <= ui->horizontalSlider->minimum())
return ;
// 滑块数值 -5,并更新显示
ui->horizontalSlider->setValue(value - 5);
}
// 快捷键【=】触发的槽函数:滑块数值加5
void Widget::addvalue()
{
// 获取拖拽创建的水平滑块当前的数值
int value = ui->horizontalSlider->value();
// 边界判断:如果当前值等于滑块最大值,直接返回,不做修改
if(value >= ui->horizontalSlider->maximum())
return ;
// 滑块数值 +5,并更新显示
ui->horizontalSlider->setValue(value + 5);
}
// ==================== 自动关联槽函数 ====================
// 命名规则:on_<控件名>_<信号名>
// 功能:拖拽创建的水平滑块数值发生改变时,自动触发该函数
// 参数 value:滑块当前的最新数值
void Widget::on_horizontalSlider_valueChanged(int value)
{
// 将滑块的数值转为字符串,拼接后设置到拖拽创建的标签上显示
ui->label->setText("当前的值为:" + QString::number(value));
}
QShortcut 对象
定义 :Qt 框架中用于封装键盘快捷键 的核心对象,实现按键与槽函数的绑定,触发指定功能。核心特性:
-
依托 Qt 父子对象机制管理内存,创建时指定父对象即可自动释放
-
独立于控件存在,全局生效,无需聚焦指定控件代码示例:
// 创建快捷键对象,指定当前窗口为父对象
QShortcut* shortcut1 = new QShortcut(this);
核心作用:承载快捷键配置,关联触发信号,是快捷键功能的载体。
QKeySequence 对象
定义 :Qt 框架中用于定义快捷键按键组合 的封装对象,标准化表示键盘按键。支持格式 :单按键、组合按键等标准按键序列代码示例:
// 设置快捷键为键盘减号键
shortcut1->setKey(QKeySequence("-"));
// 设置快捷键为键盘等号键
shortcut2->setKey(QKeySequence("="));
核心作用 :将物理按键转换为 Qt 可识别的快捷键序列,完成按键绑定。
activated 信号
定义 :QShortcut 对象的核心信号,用户按下绑定的快捷键时触发 。信号特性 :无参数,纯触发信号,需通过 connect 绑定槽函数执行逻辑代码示例:
// 快捷键按下时,触发subvalue槽函数
connect(shortcut1, &QShortcut::activated, this, &Widget::subvalue);
核心作用:连接快捷键操作与业务逻辑,实现按键触发功能。
horizontalSlider 对象
定义 :Qt Designer 拖拽创建的QSlider 水平滑块控件 ,属于滑动调节数值的交互控件。核心特性:
-
支持水平方向滑动,可视化调节整型数值
-
内置数值范围,包含 minimum 最小值、maximum 最大值边界
-
可获取当前值、设置指定值,实时响应滑动操作代码示例:
// 获取滑块当前数值
int value = ui->horizontalSlider->value();
// 设置滑块数值
ui->horizontalSlider->setValue(value - 5);
// 获取滑块最小值
ui->horizontalSlider->minimum();
核心作用:提供可视化滑动交互,完成数值的调节与展示。
valueChanged 信号
定义 :QSlider 控件的核心信号,滑块数值发生变化时自动触发 。信号特性 :携带 int 类型参数,参数为滑块当前最新数值 自动关联规则 :遵循 on_<控件名>_< 信号名 > 命名规则,无需手动 connect代码示例:
// 滑块数值变化自动触发的槽函数
void Widget::on_horizontalSlider_valueChanged(int value)
{
ui->label->setText("当前的值为:" + QString::number(value));
}
核心作用:实时响应滑块数值变化,同步更新界面展示或执行关联逻辑。
QWidget 核心控件之 List Widget(链表)
#include "widget.h"
#include "ui_widget.h"
// Qt调试输出头文件,用于控制台打印选中的列表项
#include <QDebug>
// 前提:widget.ui中已通过Qt Designer拖拽创建以下控件
// 1. QListWidget 对象名:listWidget 列表展示控件
// 2. QLineEdit 对象名:lineEdit 输入框控件
// 3. QPushButton 对象名:pushButton_add 添加按钮
// 4. QPushButton 对象名:pushButton_delete 删除按钮
// 所有槽函数均为Qt自动关联,无需手动connect
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有拖拽创建的控件,执行后ui->下的控件均可使用
ui->setupUi(this);
// ==================== 初始化列表控件:添加固定选项 ====================
// QListWidget::addItem:向拖拽创建的列表控件中添加一行文本项
// 等价写法:ui->listWidget->addItem(new QListWidgetItem("C++"));
ui->listWidget->addItem("C++");
ui->listWidget->addItem("Java");
ui->listWidget->addItem("Python");
}
Widget::~Widget()
{
// 自动释放所有拖拽创建的控件资源
delete ui;
}
// ==================== 添加按钮点击槽函数 ====================
// 自动关联:点击【添加】按钮时触发
void Widget::on_pushButton_add_clicked()
{
// 判断:如果输入框内容为空,直接返回,不执行添加
if(ui->lineEdit->text().isEmpty() == true)
return ;
// 获取输入框中的文本内容
const QString text = ui->lineEdit->text();
// 将输入框的文本添加到列表控件中
ui->listWidget->addItem(text);
// 添加完成后,清空输入框的内容,方便下次输入
ui->lineEdit->setText("");
}
// ==================== 删除按钮点击槽函数 ====================
// 自动关联:点击【删除】按钮时触发
void Widget::on_pushButton_delete_clicked()
{
// 获取列表控件中当前选中项的行号(从0开始,未选中返回-1)
int row = ui->listWidget->currentRow();
// 判断:如果没有选中任何项,直接返回,不执行删除
if(row < 0)
return ;
// 移除指定行的列表项(仅移除,不释放内存,Qt会自动管理)
ui->listWidget->takeItem(row);
}
// ==================== 列表项选中变化槽函数 ====================
// 自动关联:当列表控件的选中项发生改变时触发
// 参数 current:新选中的列表项
// 参数 previous:上一次选中的列表项
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
// 如果新选中项不为空,打印当前选中的文本
if(current != nullptr)
qDebug() << "当前选中的元素: " << current->text();
// 如果上一次选中项不为空,打印上一次选中的文本
if(previous != nullptr)
qDebug() << "上次选中的元素: " << previous->text();
}
QListWidget 对象
定义 :Qt 框架中的列表展示控件 ,用于单列展示多行文本或自定义项,支持添加、删除、选中项监听等交互操作。核心特性:
-
可通过 Qt Designer 拖拽创建,通过
ui->listWidget直接访问 -
以
QListWidgetItem为基本单元管理每一行列表项 -
支持单选模式,适配列表选择类业务场景代码示例:
// 初始化列表控件
ui->setupUi(this);
addItem(new QListWidgetItem("C++"))
作用 :向 QListWidget 中添加手动创建的列表项对象 ,属于底层标准添加方式。核心解析:
-
QListWidgetItem:QListWidget 的最小展示单元,对应列表中的一行 -
new QListWidgetItem("C++"):动态创建项对象,指定显示文本为C++ -
可提前配置项的样式、图标、标记等属性,灵活性更高代码示例:
// 手动创建列表项并添加至控件
ui->listWidget->addItem(new QListWidgetItem("C++"));
addItem("C++")
作用 :QListWidget 的简化重载方法 ,直接传入文本字符串添加列表项。核心解析:
-
底层自动创建
QListWidgetItem对象,无需手动new -
仅需指定显示文本,快速实现纯文本项的添加
-
简化代码编写,适配常规纯文本列表场景代码示例:
// 直接传入文本,快速添加列表项
ui->listWidget->addItem("C++");
currentRow 函数
作用 :获取 QListWidget 中当前选中项的行号 ,是定位选中项的核心接口。核心解析:
-
返回值为int 类型 ,行号从0开始计数
-
无选中项时,返回 **-1**,可用于判断选中状态
-
配合删除、修改操作,精准定位目标列表项代码示例:
// 获取当前选中项的行号
int row = ui->listWidget->currentRow();
currentItemChanged 信号
作用 :QListWidget 的核心信号,列表选中项发生变化时自动触发 。核心解析:
-
携带两个指针参数:
current(新选中项)、previous(上一次选中项) -
参数为
nullptr时,代表无对应选中项 -
遵循 Qt 自动关联规则,无需手动
connect绑定代码示例:// 选中项变化触发的槽函数
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
if(current != nullptr)
qDebug() << "当前选中的元素: " << current->text();
}
QWidget 核心控件之 Table Widget(表格)
#include "widget.h"
#include "ui_widget.h"
// 前提:
// 1. widget.ui 中已通过拖拽创建 QTableWidget 控件
// 2. 控件对象名:tableWidget(核心表格控件)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有拖拽创建的控件,执行后 tableWidget 才能正常使用
ui->setupUi(this);
// ==================== 1. 插入行 ====================
// 在表格的 第0行 位置,插入一行
ui->tableWidget->insertRow(0);
// 在表格的 第1行 位置,插入一行
// 执行后:表格总共有 2 行
ui->tableWidget->insertRow(1);
// ==================== 2. 插入列 ====================
// 在表格的 第0列 位置,插入一列
ui->tableWidget->insertColumn(0);
// 在表格的 第1列 位置,插入一列
ui->tableWidget->insertColumn(1);
// 在表格的 第2列 位置,插入一列
// 执行后:表格总共有 3 列
ui->tableWidget->insertColumn(2);
// ==================== 3. 设置水平表头(顶部列名) ====================
// 第0列表头:学号
ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("学号"));
// 第1列表头:姓名
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));
// 第2列表头:年龄
ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("年龄"));
// ==================== 4. 演示:新增一行 ====================
// 获取当前表格的总行数(此时是 2 行)
int rowCount = ui->tableWidget->rowCount();
// 在表格**最后一行的后面**,新增一行
ui->tableWidget->insertRow(rowCount);
// ==================== 5. 演示:删除刚才新增的行 ====================
// 删除第 rowCount 行(也就是刚加的那一行)
ui->tableWidget->removeRow(rowCount);
// ==================== 6. 演示:新增一列 ====================
// 获取当前表格的总列数(此时是 3 列)
int columnCount = ui->tableWidget->columnCount();
// 在表格**最后一列的后面**,新增一列
ui->tableWidget->insertColumn(columnCount);
// 给新增的列设置表头:班级
ui->tableWidget->setHorizontalHeaderItem(columnCount, new QTableWidgetItem("班级"));
// ==================== 7. 演示:删除刚才新增的列 ====================
// 删除第 columnCount 列(也就是刚加的班级列)
ui->tableWidget->removeColumn(columnCount);
}
// 析构函数:自动释放所有拖拽创建的控件
Widget::~Widget()
{
delete ui;
}
QTableWidget
定义 :Qt 框架中的表格控件 ,用于展示二维行列结构的结构化数据,支持行 / 列的增删、表头配置、单元格数据管理,是 GUI 界面展示表格数据的核心控件。核心特性:
-
以行 和列构建基础结构,单元格为最小数据单元
-
可通过 Qt Designer 拖拽创建,通过
ui->tableWidget直接访问 -
依赖
QTableWidgetItem完成单元格与表头的数据封装代码示例:// 初始化表格控件
ui->setupUi(this);
insertRow
作用 :在 QTableWidget 的指定索引位置插入一行 ,动态增加表格行数。参数说明 :参数为int 类型 ,表示插入行的索引,索引从0 开始计数。代码示例:
// 在第0行位置插入一行
ui->tableWidget->insertRow(0);
// 在第1行位置插入一行
ui->tableWidget->insertRow(1);
核心规则 :插入行后,原有行自动向后顺延,表格总行数递增。
insertColumn
作用 :在 QTableWidget 的指定索引位置插入一列 ,动态增加表格列数。参数说明 :参数为int 类型 ,表示插入列的索引,索引从0 开始计数。代码示例:
// 在第0列位置插入一列
ui->tableWidget->insertColumn(0);
// 在第1列位置插入一列
ui->tableWidget->insertColumn(1);
核心规则 :插入列后,原有列自动向后顺延,表格总列数递增。
setHorizontalHeaderItem
作用 :设置 QTableWidget 的水平表头项 ,配置表格顶部的列名称。参数说明:
-
第一个参数:int 类型,列的索引值
-
第二个参数:QTableWidgetItem 对象 ,封装表头的显示文本代码示例:
// 设置第0列水平表头为"学号"
ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("学号"));
// 设置第1列水平表头为"姓名"
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));
rowCount
作用 :获取 QTableWidget 当前的总行数 ,返回值为int 类型 。核心用途 :获取总行数后,可在表格末尾追加新行,实现动态扩容。代码示例:
// 获取表格当前总行数
int rowCount = ui->tableWidget->rowCount();
// 在表格末尾插入新行
ui->tableWidget->insertRow(rowCount);
removeRow
作用 :删除 QTableWidget 中指定索引的行 ,动态减少表格行数。参数说明 :参数为int 类型 ,表示待删除行的索引值。代码示例:
// 删除指定索引的行
ui->tableWidget->removeRow(rowCount);
核心规则 :删除行后,后续行自动向前补齐,表格总行数递减。
columnCount
作用 :获取 QTableWidget 当前的总列数 ,返回值为int 类型 。核心用途 :获取总列数后,可在表格末尾追加新列,实现动态扩容。代码示例:
// 获取表格当前总列数
int columnCount = ui->tableWidget->columnCount();
// 在表格末尾插入新列
ui->tableWidget->insertColumn(columnCount);
QTableWidgetItem
定义 :QTableWidget 的最小数据单元 ,用于封装表格单元格、水平表头的文本、样式等数据。核心特性:
-
独立承载单个单元格 / 表头的显示内容
-
支持文本、字体、颜色等属性配置
-
作为数据载体,与表格控件完成数据绑定代码示例:
// 创建表头数据项
new QTableWidgetItem("学号");
// 创建单元格数据项
new QTableWidgetItem("1001");
removeColumn
作用 :删除 QTableWidget 中指定索引的列 ,动态减少表格列数。参数说明 :参数为int 类型 ,表示待删除列的索引值。代码示例:
// 删除指定索引的列
ui->tableWidget->removeColumn(columnCount);
核心规则 :删除列后,后续列自动向前补齐,表格总列数递减。
QWidget 核心控件之 Tree Widget(树形)
#include "widget.h"
#include "ui_widget.h"
// 前提:
// 1. widget.ui中已通过Qt Designer拖拽创建两个控件:
// - QTreeWidget:树形结构展示控件,对象名 treeWidget
// - QPushButton:删除按钮,对象名 pushButton_delete
// 2. 槽函数 on_pushButton_delete_clicked() 为Qt自动关联,无需手动connect
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化所有拖拽创建的控件,执行后ui->treeWidget、ui->pushButton_delete方可使用
ui->setupUi(this);
// ==================== 初始化树形控件 ====================
// 设置树形控件的**顶层表头文字**为:动物
ui->treeWidget->setHeaderLabel("动物");
// ==================== 创建顶层节点(一级节点) ====================
// 创建第一个顶层节点对象
QTreeWidgetItem* item1 = new QTreeWidgetItem();
// 设置节点第0列的文本为:猫
item1->setText(0, "猫");
// 将该节点添加为树形控件的顶层节点
ui->treeWidget->addTopLevelItem(item1);
// 创建第二个顶层节点对象
QTreeWidgetItem* item2 = new QTreeWidgetItem();
// 设置节点第0列的文本为:狗
item2->setText(0, "狗");
// 将该节点添加为树形控件的顶层节点
ui->treeWidget->addTopLevelItem(item2);
// ==================== 创建子节点(二级节点) ====================
// 创建子节点对象
QTreeWidgetItem* item3 = new QTreeWidgetItem();
item3->setText(0, "田园猫");
// 将item3添加为item1(猫)的子节点
item1->addChild(item3);
// 创建子节点对象
QTreeWidgetItem* item4 = new QTreeWidgetItem();
item4->setText(0, "哈士奇");
// 将item4添加为item2(狗)的子节点
item2->addChild(item4);
}
Widget::~Widget()
{
// 自动释放所有拖拽创建的控件资源
delete ui;
}
// ==================== 删除按钮点击槽函数 ====================
// 功能:删除树形控件中当前选中的节点(自动区分顶层节点/子节点)
void Widget::on_pushButton_delete_clicked()
{
// 获取树形控件中**当前选中的节点**,未选中则返回nullptr
QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
// 如果没有选中任何节点,直接退出,不执行删除
if(currentItem == nullptr)
return ;
// 获取当前选中节点的**父节点**
QTreeWidgetItem* parent = currentItem->parent();
// 判断1:父节点为空 → 当前节点是【顶层节点】
if(parent == nullptr)
{
// 获取该顶层节点在树形控件中的索引
int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
// 移除指定索引的顶层节点
ui->treeWidget->takeTopLevelItem(index);
}
// 判断2:父节点不为空 → 当前节点是【子节点】
else
{
// 从父节点中移除当前子节点
parent->removeChild(currentItem);
}
}
QTreeWidget
定义 :Qt 框架中的树形结构展示控件 ,用于展示层级化、嵌套式数据,支持多级节点嵌套展示,是 GUI 界面实现层级列表的核心控件。核心特性:
-
支持顶层节点、子节点的多级嵌套结构
-
可通过 Qt Designer 拖拽创建,通过
ui->treeWidget直接访问 -
以
QTreeWidgetItem作为基础节点单元管理数据代码示例:// 初始化树形控件
ui->setupUi(this);
setHeaderLabel
作用 :设置 QTreeWidget 的顶层表头文本 ,配置树形控件的列标题。参数说明 :参数为QString 类型,为表头的显示文本。代码示例:
// 设置树形控件表头为"动物"
ui->treeWidget->setHeaderLabel("动物");
QTreeWidgetItem
定义 :QTreeWidget 的节点单元对象 ,承载树形结构中节点的文本、样式等数据,是构建层级结构的最小单元。核心特性:
-
分为顶层节点 、子节点两类层级
-
通过
setText配置节点显示文本 -
支持父子节点嵌套,实现多级树形结构代码示例:
// 创建节点对象
QTreeWidgetItem* item1 = new QTreeWidgetItem();
// 设置节点第0列文本
item1->setText(0, "猫");
addTopLevelItem
作用 :向 QTreeWidget 中添加顶层节点 ,将节点设置为一级根节点。参数说明 :参数为QTreeWidgetItem 指针 ,代表待添加的顶层节点。代码示例:
// 添加顶层节点至树形控件
ui->treeWidget->addTopLevelItem(item1);
addChild
作用 :为指定节点添加子节点 ,实现父子层级嵌套。参数说明 :参数为QTreeWidgetItem 指针 ,代表待添加的子节点。代码示例:
// 为item1添加子节点item3
item1->addChild(item3);
currentItem
作用 :获取 QTreeWidget 中当前选中的节点 ,无选中节点时返回nullptr 。返回值 :QTreeWidgetItem 指针,指向选中的目标节点。代码示例:
// 获取当前选中的节点
QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
parent
作用 :获取指定节点的父节点对象 ,用于区分节点层级。返回值:QTreeWidgetItem 指针:
-
顶层节点:返回nullptr
-
子节点:返回对应父节点代码示例:
// 获取当前节点的父节点
QTreeWidgetItem* parent = currentItem->parent();
indexOfTopLevelItem
作用 :获取指定顶层节点在 QTreeWidget 中的索引值 ,索引从0 开始计数。参数说明 :参数为QTreeWidgetItem 指针 ,代表目标顶层节点。代码示例:
// 获取顶层节点的索引
int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
takeTopLevelItem
作用 :移除 QTreeWidget 中指定索引的顶层节点 ,仅用于顶层节点删除。参数说明 :参数为int 类型,代表顶层节点的索引。代码示例:
// 移除指定索引的顶层节点
ui->treeWidget->takeTopLevelItem(index);
removeChild
作用 :从父节点中移除指定的子节点 ,仅用于子节点删除。参数说明 :参数为QTreeWidgetItem 指针 ,代表待删除的子节点。代码示例:
// 从父节点中移除子节点
parent->removeChild(currentItem);
QWidget 核心控件之 BoxLayout(布局管理器)
#include "widget.h"
#include "ui_widget.h"
// QPushButton:按钮控件头文件(代码动态创建按钮使用)
#include <QPushButton>
// QVBoxLayout:垂直布局管理器(控件从上到下排列)
#include <QVBoxLayout>
// QHBoxLayout:水平布局管理器(控件从左到右排列)
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 初始化UI文件(本代码未使用拖拽控件,纯代码创建布局和按钮)
ui->setupUi(this);
// ==================== 1. 动态创建按钮控件(代码手动new创建,非UI拖拽) ====================
// 创建4个按钮对象,指定按钮显示文本
QPushButton* button1 = new QPushButton("button1");
QPushButton* button2 = new QPushButton("button2");
QPushButton* button3 = new QPushButton("button3");
QPushButton* button4 = new QPushButton("button4");
// ==================== 2. 创建垂直布局,添加顶部两个按钮 ====================
// 创建垂直布局管理器:控件会**从上到下**垂直排列
QVBoxLayout* vlayout = new QVBoxLayout();
// 将按钮1添加到垂直布局中
vlayout->addWidget(button1);
// 将按钮2添加到垂直布局中
vlayout->addWidget(button2);
// 将垂直布局设置为当前窗口的**主布局**(窗口会自动按照布局排列控件)
this->setLayout(vlayout);
// ==================== 3. 创建水平布局,嵌套进垂直布局(布局嵌套) ====================
// 创建水平布局管理器:控件会**从左到右**水平排列
QHBoxLayout* hlayout = new QHBoxLayout();
// 将按钮3、按钮4添加到水平布局中
hlayout->addWidget(button3);
hlayout->addWidget(button4);
// 将水平布局**作为一个整体**,添加到垂直布局的底部
// 实现:垂直布局嵌套水平布局的混合布局效果
vlayout->addLayout(hlayout);
}
Widget::~Widget()
{
// 释放UI对象,Qt自动管理布局和子控件的内存,无需手动delete按钮/布局
delete ui;
}
QVBoxLayout
定义 :Qt 框架中的垂直布局管理器 ,可将控件按照从上到下 的方向自动排列,自动管理控件的位置、间距与大小适配。核心特性:
-
无需手动设置控件坐标,自适应窗口尺寸
-
支持嵌套其他布局,构建复杂排版
-
由 Qt 自动管理内存,无需手动释放代码示例:
// 创建垂直布局管理器对象
QVBoxLayout* vlayout = new QVBoxLayout();
addWidget
作用 :向布局管理器中添加控件 ,将控件纳入布局的排列管理体系。参数说明 :参数为QWidget * 类型,指向待添加的控件对象。核心规则 :控件按照布局的排列方向(垂直 / 水平)依次添加。代码示例:
// 向垂直布局添加按钮控件
vlayout->addWidget(button1);
// 向水平布局添加按钮控件
hlayout->addWidget(button3);
setLayout
作用 :为窗口或容器控件设置主布局 ,使控件按照指定布局规则进行排列。参数说明 :参数为QLayout * 类型,指向待设置的布局管理器。核心特性 :设置后,窗口会自动适配布局,控件随窗口缩放自动调整。代码示例:
// 为当前窗口设置垂直布局作为主布局
this->setLayout(vlayout);
QHBoxLayout
定义 :Qt 框架中的水平布局管理器 ,可将控件按照从左到右 的方向自动排列,自动适配窗口大小。核心特性:
-
实现控件的水平方向规整排列
-
可与垂直布局嵌套使用,完成混合排版
-
属于 Qt 标准布局组件,内存自动管理代码示例:
// 创建水平布局管理器对象
QHBoxLayout* hlayout = new QHBoxLayout();
addLayout
作用 :向父布局中嵌套添加子布局 ,实现布局的层级嵌套,构建复杂界面结构。参数说明 :参数为QLayout * 类型,指向待嵌套的子布局对象。核心规则 :子布局作为一个整体,遵循父布局的排列规则。代码示例:
// 将水平布局嵌套添加到垂直布局中
vlayout->addLayout(hlayout);