Qt 开发【第四篇】——— 常用基础、显示及输入控件核心特性概述

目录

[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++")))

addItem("C++")

[currentRow 函数](#currentRow 函数)

[currentItemChanged 信号](#currentItemChanged 信号)
[QWidget 核心控件之 Table Widget(表格)](#QWidget 核心控件之 Table Widget(表格))

QTableWidget

insertRow

insertColumn

setHorizontalHeaderItem

rowCount

removeRow

columnCount

QTableWidgetItem

removeColumn
[QWidget 核心控件之 Tree Widget(树形)](#QWidget 核心控件之 Tree Widget(树形))

QTreeWidget

setHeaderLabel

QTreeWidgetItem

addTopLevelItem

addChild

currentItem

parent

indexOfTopLevelItem

takeTopLevelItem

removeChild
[QWidget 核心控件之 BoxLayout(布局管理器)](#QWidget 核心控件之 BoxLayout(布局管理器))

QVBoxLayout

addWidget

setLayout

QHBoxLayout

addLayout


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_WQt::Key_Enter);
  • 组合按键方式(key2):参数为「修饰键 + 普通键」的组合,修饰键支持CTRLSHIFTALTMeta(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仅影响鼠标点击的连发行为。

总结

  1. QIcon 用于管理图标资源,setIcon 为按钮设置图标,QSize 定义尺寸,setIconSize 指定按钮图标的显示尺寸;
  2. setText 设置按钮文本,QKeySequence 支持单个 / 组合按键的快捷键定义,setShortcut 为按钮绑定快捷键;
  3. 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为取消选中状态;
  • 生效特性:
    1. 设置为true且按钮开启排他性时,同一父控件下的其他单选按钮会自动取消选中;
    2. 单选按钮默认无选中项,需手动调用该函数设置默认选中项;
    3. 代码调用该函数修改状态时,会触发toggled信号,但不会触发clicked信号(仅用户交互点击触发)。

setCheckable 函数解析

setCheckable 是 QAbstractButton 类的成员函数,核心作用是控制按钮是否可被选中,代码示例:

复制代码
buttonOther->setCheckable(false); // 不可被选中
buttonOther->setCheckable(true);  // 默认可被选中(默认值)
  • 函数参数:布尔类型(bool),true为按钮可被选中(点击 / 代码可修改选中状态),false为按钮不可被选中;
  • 关键特性:
    1. 设置为false时,按钮无选中视觉状态,点击也无法改变选中状态,但仍会响应clicked信号;
    2. QRadioButton 默认值为true(可选中),QPushButton 默认值为false(不可选中)。

setEnabled 函数解析

setEnabled 是 QWidget 类的成员函数,核心作用是控制按钮是否可用(灰显 / 可交互),代码示例:

复制代码
buttonOther->setEnabled(false); // 禁用按钮(灰显,不可点击)
buttonOther->setEnabled(true);  // 启用按钮(默认值)
  • 函数参数:布尔类型(bool),true为启用按钮(可点击、响应信号),false为禁用按钮;
  • 生效特性:
    1. 禁用状态下,按钮视觉上灰显,无法通过鼠标 / 键盘点击,也不会响应clicked/toggled等交互信号;
    2. 禁用状态不影响代码修改选中状态(如setChecked(true)仍可生效),仅限制用户交互。

setAutoExclusive 函数解析

setAutoExclusive 是 QAbstractButton 类的成员函数,核心作用是开启 / 关闭按钮的排他性,代码示例:

复制代码
buttonOther->setAutoExclusive(false); // 取消排他性
buttonOther->setAutoExclusive(true);  // 开启排他性(QRadioButton默认值)
  • 函数参数:布尔类型(bool),true为开启排他性,false为取消排他性;
  • 生效特性:
    1. 取消排他性后,该按钮可与同一父控件下的其他单选按钮同时选中(失去单选特性);
    2. 排他性仅对 QRadioButton 有实际意义,QPushButton 默认关闭该属性;
    3. 不同父控件的单选按钮,即使开启排他性,也不会互斥。

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表示变为未选中状态;
  • 触发条件:
    1. 用户点击按钮导致状态变化;
    2. 代码调用setChecked()修改状态;
    3. 排他性导致按钮自动取消选中;
  • 适用场景:需监听所有选中状态变化的场景(无论用户操作还是代码修改)。

QButtonGroup 类解析

QButtonGroup 是 Qt 框架中用于对按钮进行分组管理的类,核心作用是打破 "父控件限制",实现任意按钮的排他分组,代码示例:

复制代码
QButtonGroup* group1 = new QButtonGroup(this);
group1->addButton(buttonMale);
group1->addButton(buttonFemale);
group1->addButton(buttonOther);
  • 核心能力:
    1. 分组排他:同一 QButtonGroup 内的 QRadioButton 强制互斥(即使父控件不同),不同分组间的按钮互不影响;
    2. 灵活管理:可通过addButton()添加按钮、removeButton()移除按钮,动态调整分组;
    3. 信号扩展:提供buttonClicked()/buttonToggled()信号,可监听整个分组的按钮状态变化;
  • 内存管理:创建时指定父对象(如this),Qt 对象树机制自动管理内存,无需手动delete
  • 设计逻辑:解决 "同一父控件下需多组单选按钮" 的场景(如页面有 "性别""学历" 两组单选,需各自排他)。

总结

  1. QRadioButton 默认开启 AutoExclusive 排他性,同一父控件下仅能选中一个,setAutoExclusive 可取消该特性;
  2. setChecked 设置选中状态,setCheckable 控制是否可选中,setEnabled 控制按钮是否可用(灰显);
  3. 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);
  • 核心能力:
    1. 多选支持:默认无排他性,可与同区域其他复选框同时选中;
    2. 文本配置 :通过setText()设置复选框旁的说明文本,清晰标识选项含义;
    3. 状态管理 :支持选中(勾选)、未选中(未勾选)两种基础状态,部分场景可扩展为三态(半选,通过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表示处于未选中(未勾选)状态;
  • 调用场景:
    1. 汇总用户选择结果时(如示例中点击 "确认" 按钮后,遍历复选框判断选中状态);
    2. 监听状态变化时,辅助判断当前状态(结合toggled信号使用);
  • 特性补充:该函数仅读取状态,不会修改复选框的选中状态,也不会触发任何信号。

总结

  1. QCheckBox 默认无排他性,同一父控件下可同时选中多个,是区别于 QRadioButton 的核心特征;
  2. QCheckBox 是 Qt 实现多选功能的基础控件,支持选中 / 未选中两种基础状态;
  3. 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::PlainTextQt::TextFormat枚举的核心取值,代表纯文本格式,代码示例:

复制代码
label1->setTextFormat(Qt::PlainText);
label1->setText("这是一段纯文本");
  • 解析规则:不解析任何标记(如 HTML、Markdown 语法),所有字符原样显示;
  • 适用场景:仅需展示无格式文本的场景(如普通提示语、数据展示),是最基础的文本格式。

Qt::RichText 枚举值解析

Qt::RichTextQt::TextFormat枚举的取值,代表富文本格式,支持解析 HTML 标记,代码示例:

复制代码
label2->setTextFormat(Qt::RichText);
label2->setText("<b>这是一段富文本</b>");
  • 解析规则:识别并渲染常见 HTML 标记(如<b>加粗、<font color="red">改颜色、<u>下划线等);
  • 适用场景:需要展示带样式文本的场景(如高亮提示、彩色文本),扩展了 QLabel 的文本展示能力。

Qt::MarkdownText 枚举值解析

Qt::MarkdownTextQt::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);
  • 核心特性:
    1. 资源加载:支持 Qt 资源文件(:/"前缀)、本地文件路径加载图片;
    2. 显示优化:针对屏幕渲染做了底层优化,比 QImage 更适合 GUI 控件的图片展示;
    3. 轻量特性:栈上创建即可,无需new,内部管理图片像素数据。

setScaledContents 函数解析

setScaledContents 是 QLabel 类的成员函数,核心作用是开启 / 关闭图片的自动拉伸功能,代码示例:

复制代码
label4->setScaledContents(true);
  • 函数参数:布尔类型(bool),true开启自动拉伸,false关闭(默认值);
  • 生效特性:
    1. 开启后,QLabel 内的图片会自适应标签的大小,拉伸 / 压缩填充整个标签区域;
    2. 关闭时,图片按原始尺寸显示,超出标签范围的部分会被截断;
    3. 该设置仅对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();
  • 核心方法:
    1. size():返回窗口变化后的新尺寸(QSize 类型);
    2. 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);
  • 水平方向枚举:
    1. Qt::AlignLeft:水平左对齐(默认值);
    2. Qt::AlignHCenter:水平居中;
    3. Qt::AlignRight:水平右对齐;
  • 垂直方向枚举:
    1. Qt::AlignTop:垂直顶部对齐;
    2. Qt::AlignVCenter:垂直居中;
    3. Qt::AlignBottom:垂直底部对齐;
  • 组合规则:通过|运算符组合水平、垂直方向,实现精准对齐。

setWordWrap 函数解析

setWordWrap 是 QLabel 类的成员函数,核心作用是开启 / 关闭文本自动换行功能,代码示例:

复制代码
label7->setWordWrap(true);
  • 函数参数:布尔类型(bool),true开启自动换行,false关闭(默认值);
  • 生效特性:
    1. 开启后,文本超出标签宽度时自动换行,避免文本截断或超出标签边框;
    2. 关闭时,文本单行显示,超出宽度的部分会被截断(或显示为省略号,需额外设置);
    3. 仅对文本生效,对图片无影响。

setIndent 函数解析

setIndent 是 QLabel 类的成员函数,核心作用是设置文本的首行缩进值,代码示例:

复制代码
label8->setIndent(50);
  • 函数参数:整型(int),单位为像素,示例中 50 表示首行缩进 50 像素;
  • 生效特性:
    1. 仅对文本的首行生效,多行文本的后续行无缩进;
    2. 缩进方向为水平方向(从左向右缩进);
    3. 对图片无生效,仅针对文本内容。

setBuddy 伙伴机制解析

setBuddy 是 QLabel 类的成员函数,核心作用是建立标签与控件的伙伴关系,实现快捷键跳转焦点的功能,代码示例:

复制代码
label9->setText("点击此文本触发button_b &B");
label9->setBuddy(button);
  • 核心规则:
    1. 快捷键定义:标签文本中&后接的字符(示例中为 B),对应快捷键Alt+B
    2. 触发效果:按下Alt+B时,焦点会自动跳转到绑定的 button 控件,但不会直接选中按钮,仅将输入焦点移至该控件;
    3. 关键限制:伙伴机制仅实现焦点跳转,无法通过Alt+B直接选中单选按钮,若需选中需额外绑定快捷键触发setChecked(true)
    4. 适用控件:仅对可获取焦点的控件(如 QRadioButton、QLineEdit、QPushButton)生效。

总结

  1. setTextFormat 设置文本解析格式,包含 PlainText(纯文本)、RichText(HTML)、MarkdownText(Markdown)三种核心类型;
  2. QPixmap 用于加载图片,setScaledContents 开启图片自动拉伸,resizeEvent(结合 QResizeEvent)响应窗口尺寸变化;
  3. setAlignment 定义文本 / 图片对齐方式(AlignHCenter 等枚举),setWordWrap 开启文本换行,setIndent 设置首行缩进;
  4. 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);
  • 核心特性:
    1. 仅支持数字显示(整数 / 浮点数),无法接收输入,适合倒计时、计数器、时钟等数字展示场景;
    2. 可通过setGeometry设置位置和大小,显示样式固定为 LCD 风格,无需额外美化;
    3. 支持多位数显示,超出位数时会自动截断或显示省略号(默认适配数字长度)。

display 函数解析

display 是 QLCDNumber 类的核心成员函数,作用是设置 QLCDNumber 要显示的数字,代码示例:

复制代码
lcdNumber->display(10); // 初始显示10
lcdNumber->display(value - 1); // 显示减1后的数值
  • 函数参数:支持intdoubleQString等类型,示例中使用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信号;
  • 生效特性:
    1. 启动后定时器持续工作,直到调用stop()或定时器对象被销毁;
    2. 重复调用start()会重置定时器,以新的间隔重新计时。

intValue 函数解析

intValue 是 QLCDNumber 类的成员函数,作用是获取当前显示的数字并转换为 int 类型返回,代码示例:

复制代码
int value = lcdNumber->intValue();
  • 返回值:QLCDNumber 当前显示的整数值(如显示 10 返回 10,显示 5 返回 5);
  • 补充特性:
    1. 若控件显示浮点数,可使用value()函数获取double类型值;
    2. 仅读取显示值,不会修改控件状态,也不会触发任何信号。

stop 函数解析

stop 是 QTimer 类的成员函数,作用是停止定时器,终止 timeout 信号触发,代码示例:

复制代码
timer->stop(); // 数值≤0时停止倒计时
  • 生效特性:
    1. 调用后定时器立即停止工作,不再触发timeout信号,倒计时终止;
    2. 停止后可再次调用start()重启定时器,无需重新创建 QTimer 对象;
    3. 仅停止定时触发,不会销毁定时器对象,内存仍由父对象管理。

总结

  1. QTimer 是 Qt 定时触发工具,通过 timeout 信号实现定时操作,start (ms) 启动定时器,stop () 停止;
  2. QLCDNumber 是 LCD 样式数字显示控件,display () 设置显示值,intValue () 获取当前显示的整数值;
  3. 倒计时核心逻辑:定时器每秒触发 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);
  • 核心特性:
    1. 进度范围:默认进度值范围为0-100(对应百分比,0=0%、100=100%),也可通过setRange(min, max)自定义范围(如setRange(0, 200)表示进度值到 200 时完成);
    2. 视觉表现:控件以 "空条 + 填充条" 的样式显示,填充部分的宽度随数值增加而扩展,直观反映进度占比;
    3. 内存管理:创建时指定父对象为当前 Widget(this),Qt 对象树机制自动管理内存,无需手动delete
    4. 交互特性:默认仅用于展示进度,无输入功能,常结合定时器 / 后台任务动态更新数值。

setValue 函数解析

setValue 是 QProgressBar 的核心成员函数,作用是设置进度条当前显示的进度数值,代码示例:

复制代码
progressBar->setValue(0); // 初始化进度为0%
progressBar->setValue(++value); // 进度值自增1后更新显示
  • 函数参数:整型(int),即要设置的进度值;
  • 生效规则:
    1. 若参数超出进度条的默认范围(0-100),会自动截断(如传入 101 则按 100 显示,传入 - 1 则按 0 显示);
    2. 调用后立即更新进度条的视觉填充效果,数值对应的占比会实时反映在控件上(如值为 50 时,进度条填充 50%);
    3. 是修改进度条显示状态的唯一核心接口,无其他替代方式。

value 函数解析

value 是 QProgressBar 的成员函数,作用是获取进度条当前的进度数值,代码示例:

复制代码
int value = progressBar->value(); // 读取当前进度值
  • 返回值:整型(int),返回进度条当前的数值(默认范围 0-100);
  • 核心用途:
    1. 在逻辑中判断进度状态(如示例中判断value >= 100,即进度是否达到 100%);
    2. 作为进度更新的 "基准值",比如示例中基于当前值自增 1,实现进度条逐步前进;
    3. 仅读取数值,不会修改进度条状态,也不会触发任何信号。

总结

  1. QProgressBar 是 Qt 可视化展示进度的核心控件,默认进度范围 0-100(百分比),视觉上以填充条反映进度占比;
  2. setValue 用于设置进度条的当前数值,参数超出范围会自动截断,调用后立即更新视觉效果;
  3. 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()); // 转换为字符串显示
  • 核心特性:
    1. 数据封装:仅存储年、月、日三个整型数据,是轻量级值类型对象,栈上创建即可(无需new);
    2. 核心能力:支持日期格式化(toString())、获取当前系统日期(QDate::currentDate())、日期计算(如addDays(7)加 7 天)、日期有效性判断(isValid())等;
    3. 无界面特性:仅处理日期数据,本身无可视化界面,需结合控件(如 QCalendarWidget、QLabel)实现日期的选择 / 展示。

QCalendarWidget 类解析

QCalendarWidget 是 Qt 框架中提供图形化日历选择界面的交互型控件类,继承自 QWidget,是 GUI 中让用户可视化选择日期的标准组件,代码示例:

复制代码
// 无需手动创建,由Qt Designer拖拽生成,通过ui->calendarWidget访问
ui->calendarWidget; // 可视化日历控件,显示月份/日期,支持鼠标点击选择
  • 核心特性:
    1. 可视化界面:默认显示当前月份的日历网格(日期数字、星期标识),支持切换月份 / 年份,用户可直接点击日期完成选择;
    2. UI 创建方式:示例中通过 Qt Designer 拖拽创建(对象名设为calendarWidget),无需手动newui->setupUi(this)初始化后即可使用;
    3. 交互联动:选中日期变化时会触发selectionChanged信号,绑定槽函数后可实时响应日期选择操作。

selectedDate 函数解析

selectedDate 是 QCalendarWidget 的核心成员函数,作用是获取日历控件当前选中的日期,代码示例:

复制代码
QDate date = ui->calendarWidget->selectedDate();
  • 返回值:QDate类型对象,包含当前选中日期的年、月、日完整信息;
  • 调用特性:
    1. 无参数,仅读取当前选中状态,不会修改控件的选择结果;
    2. 初始状态:默认选中当前系统日期,用户点击其他日期后,返回值会更新为新选中的日期;
    3. 核心用途:将日历控件的 "可视化选择结果" 转换为 QDate 数据,便于后续处理(如格式化显示、日期计算)。

selectionChanged 信号解析

selectionChanged 是 QCalendarWidget 的核心信号,触发时机为日历控件的选中日期发生变化时,代码示例:

复制代码
// 自动关联槽函数(命名规则:on_<控件对象名>_<信号名>)
void Widget::on_calendarWidget_selectionChanged()
  • 触发条件:
    1. 用户鼠标点击日历中的不同日期(选中日期改变);
    2. 代码调用setSelectedDate()修改选中日期(如ui->calendarWidget->setSelectedDate(QDate(2026, 3, 20)));
  • 信号特性:
    1. 无参数,仅通知 "选中日期变了",需通过selectedDate()主动获取新日期;
    2. 自动关联:示例中未手动调用connect,是因为遵循 Qt 的 "自动关联槽函数" 规则 ------ 槽函数命名为on_控件对象名_信号名,Qt 会自动完成信号槽绑定;
    3. 核心作用:实现 "选中日期变化→实时更新展示" 的联动逻辑(如示例中更新 Label 显示选中的日期)。

总结

  1. QDate 是处理日期数据的轻量级类,封装年 / 月 / 日,支持格式化和日期计算,无可视化界面;
  2. QCalendarWidget 是图形化日历选择控件,提供可视化日期选择界面,支持鼠标交互;
  3. 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),无需手动newui->setupUi(this)初始化后可直接通过ui->访问。

  • 核心特性:
    1. 基础输入:支持普通文本输入、复制粘贴、全选等基础文本操作;
    2. 交互增强:可设置占位提示、清除按钮、密码隐藏、输入格式验证等;
    3. 信号丰富:提供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模式特性:
    1. 用户输入的所有字符都会被隐藏,显示为圆点(・)或星号(*)(取决于系统样式);
    2. 仅隐藏视觉显示,text()函数仍能获取真实输入的密码文本;
  • 其他常用模式(补充):
    • QLineEdit::Normal:默认模式,输入什么显示什么(如姓名 / 手机号输入框);
    • QLineEdit::PasswordEchoOnEdit:输入时显示字符,失去焦点后隐藏(兼顾输入校对和隐私)。

setEnabled 函数解析

setEnabled 是 QWidget 类的通用成员函数,作用是控制控件是否启用(可交互),代码示例:

复制代码
ui->pushButton->setEnabled(false); // 禁用按钮(初始状态)
ui->pushButton->setEnabled(true);  // 启用按钮(手机号格式正确时)
  • 函数参数:布尔类型(bool),true为启用(控件正常显示、可点击 / 输入),false为禁用;
  • 禁用效果:
    1. 控件视觉上灰显(颜色变浅),无法响应鼠标点击、键盘输入等交互操作;
    2. 示例中用于 "仅手机号格式正确时才能点击提交按钮",避免无效提交。

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));
  • 核心作用:
    1. 实时限制输入:用户输入的字符若不符合正则规则,会被直接过滤(无法输入);例如输入字母、以 0 开头的数字,输入框不会接收;
    2. 仅允许合法字符:示例中仅允许输入以 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)
  • 函数参数:
    1. QString &content:待校验的文本(示例中为手机号输入框的当前文本);
    2. int &pos:校验的起始位置(通常传 0,表示从文本开头校验);
  • 返回值(QValidator::State 枚举):
    1. QValidator::Acceptable:文本完全符合规则(示例中为手机号格式正确,11 位以 1 开头的数字);
    2. QValidator::Intermediate:文本部分符合(如输入了 138,还未输完 11 位);
    3. QValidator::Invalid:文本完全不符合(如以 0 开头、包含字母);
  • 示例逻辑:仅返回Acceptable时,才启用提交按钮,确保只有格式正确的手机号能提交。

总结

  1. QLineEdit 是单行文本输入控件,setPlaceholderText 设占位提示,setEchoMode (Password) 隐藏密码输入;
  2. QRegExp 封装正则规则,setValidator 结合 QRegExpValidator 可实时限制输入框格式;
  3. 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访问。

  • 核心特性:
    1. 多行支持:天然支持换行输入 / 显示,无需额外配置(区别于 QLineEdit 默认单行);
    2. 格式兼容:既支持纯文本编辑,也支持富文本(HTML 格式、加粗 / 颜色 / 下划线等);
    3. 交互能力:内置撤销(Ctrl+Z)、重做(Ctrl+Y)、复制(Ctrl+C)、粘贴等基础文本操作;
    4. 光标 / 选区:可精准控制文本光标位置、选中文本范围,适配精细化文本操作场景。

textChanged 信号解析

textChanged 是 QTextEdit 的核心信号,触发时机为文本内容发生任何变化时 ,代码示例中绑定到on_textEdit_textChanged()槽函数:

复制代码
void Widget::on_textEdit_textChanged()
  • 触发条件:
    1. 用户手动输入 / 删除字符、粘贴 / 清空文本;
    2. 代码调用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()
  • 触发条件:
    1. 用户鼠标拖动选中文本、点击取消选中;
    2. 代码通过QTextCursor修改选中文本范围;
  • 信号特性:无参数,需通过textCursor()->selectedText()获取选中的文本;
  • 核心用途:示例中实时打印选中的文本,适配 "选中文本预览 / 处理" 场景(如复制、替换选中内容)。

QTextCursor 类解析

QTextCursor 是 Qt 框架中封装文本光标 / 选中文本范围的轻量级值类型类(非控件类),相当于 "文本编辑的操作手柄",代码示例:

复制代码
QTextCursor cursor = ui->textEdit->textCursor();
  • 核心能力:
    1. 光标位置:读取 / 设置光标在文本中的绝对位置;
    2. 选区管理:读取 / 修改选中文本的范围(起始 / 结束位置);
    3. 文本操作:插入 / 删除 / 替换光标处的文本,无需直接修改 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()
  • 触发条件:
    1. 用户鼠标点击文本不同位置、按方向键移动光标;
    2. 输入 / 删除字符导致光标位置自动移动;
    3. 代码修改光标位置;
  • 信号特性:无参数,需通过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)
  • 信号参数:布尔类型btrue表示可执行撤销(Ctrl+Z),false表示无可撤销操作;
  • 触发场景:
    • 输入文本后:b=true(可撤销输入操作);
    • 执行撤销后:若已撤销所有操作,b=false
  • 核心用途:可根据该信号启用 / 禁用 "撤销" 按钮,提升界面交互体验。

redoAvailable 信号解析

redoAvailable是 QTextEdit 的信号,触发时机为 **"重做" 操作的可用状态变化时 **,代码示例:

复制代码
void Widget::on_textEdit_redoAvailable(bool b)
  • 信号参数:布尔类型btrue表示可执行重做(Ctrl+Y),false表示无可重做操作;
  • 触发场景:
    • 执行撤销后:b=true(可重做被撤销的操作);
    • 执行重做后:若已重做所有操作,b=false
  • 核心用途:可根据该信号启用 / 禁用 "重做" 按钮,适配文本编辑的回滚 / 恢复需求。

copyAvailable 信号解析

copyAvailable是 QTextEdit 的信号,触发时机为 **"复制" 操作的可用状态变化时 **,代码示例:

复制代码
void Widget::on_textEdit_copyAvailable(bool b)
  • 信号参数:布尔类型btrue表示有选中文本(可执行 Ctrl+C 复制),false表示无选中文本;
  • 触发场景:
    • 选中文本后:b=true
    • 取消选中 / 无文本时:b=false
  • 核心用途:可根据该信号启用 / 禁用 "复制" 按钮,避免无效的复制操作。

总结

  1. QTextEdit 是多行文本编辑控件,支持纯文本 / 富文本,内置撤销 / 重做 / 复制等基础操作;
  2. textChanged 监听文本内容变化,selectionChanged 监听选区变化,cursorPositionChanged 监听光标位置变化;
  3. QTextCursor 是文本光标 / 选区的操作核心,textCursor () 获取光标对象,position () 读光标位置,selectedText () 读选中文本;
  4. 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);
相关推荐
问水っ2 小时前
Qt Creator快速入门 第三版 第7章 Qt对象模型与容器类
开发语言·qt
郝学胜-神的一滴2 小时前
图形学基础:OpenGL、图形引擎与IG的核心认知及核心模式解析
开发语言·c++·qt·程序人生·图形渲染
yunn_2 小时前
Qt智能指针
c++·qt
我在人间贩卖青春20 小时前
Qt 项目发布
qt·项目发布
不才小强1 天前
Qt开发实战:屏幕录制项目中学习到的知识与遇到的难题
qt·音视频
人还是要有梦想的1 天前
QT的基本学习路线
开发语言·qt·学习
艾莉丝努力练剑1 天前
【QT】QT快捷键整理
linux·运维·服务器·开发语言·图像处理·人工智能·qt
黑化暴龙魔神--幻梦1 天前
QT使用TRANSLATIONS添加多国翻译(详细过程)
qt·自动翻译
程序员_大白1 天前
【2025版】最新Qt下载安装及配置教程(非常详细)零基础入门到精通,收藏这篇就够了
开发语言·qt