Qt框架核心组件完全指南:从按钮交互到定时器实现

文章目录

  • 前言
  • [一、QAbstractButton 按钮类](#一、QAbstractButton 按钮类)
    • 概述
    • [1.1 常用属性](#1.1 常用属性)
    • [1.2 常用信号](#1.2 常用信号)
    • [1.3QButtonGroup 按钮组](#1.3QButtonGroup 按钮组)
  • [二、QComboBox 组合框](#二、QComboBox 组合框)
  • 三、若干与数字相关的组件
  • [四、QString 字符串类](#四、QString 字符串类)
  • 五、Qt容器类
    • [5.1 顺序容器 QList](#5.1 顺序容器 QList)
    • [5.2 关联容器 QMap](#5.2 关联容器 QMap)
  • 六、QVariant
  • 七、跨平台数据类型
    • [7.1 基础数据类型](#7.1 基础数据类型)
    • [7.2 特殊用途类型](#7.2 特殊用途类型)
    • [7.3 字符类型](#7.3 字符类型)
  • [八、QDateTime 日期时间类](#八、QDateTime 日期时间类)
    • [8.1 常用函数](#8.1 常用函数)
    • [8.2 常用格式符](#8.2 常用格式符)
    • [8.3 相关组件](#8.3 相关组件)
    • [8.4 代码示例](#8.4 代码示例)
  • [九、QTimer 定时器类](#九、QTimer 定时器类)
    • [9.1 主要属性](#9.1 主要属性)
    • [9.2 常用函数](#9.2 常用函数)
    • [9.3 代码示例](#9.3 代码示例)
  • 总结

前言

上一篇文章,我们已经探讨了Qlabe的使用,今天我们将继续进行c++版本Qt的讨论与学习。本篇文章会继续完成按钮类等基本类别的介绍和qt各种组件的学习。如果有任何问题,欢迎评论留言。如果发现文章有不妥和错误之处,欢迎各位小伙伴们在评论区指正,笔者会每一条评论和留言都会查看。


一、QAbstractButton 按钮类

概述

QAbstractButton是按钮控件的抽象基类,提供了按钮的基础特性和功能。
QAbstractButton
基类 QCheckBox
复选框 QRadioButton
单选按钮 QPushButton
按压式按钮 QToolButton
工具按钮


1.1 常用属性

  • text: 按钮显示的文本
  • icon : 按钮显示的图标(可从iconfont.cn获取非商用图标)
  • checkable: 按钮是否可选中
  • checked: 按钮是否被选中
  • down : 按钮是否被按下

图标可以从下面的网站下载(非商用):

免费图标icons
阿里巴巴矢量图标库


1.2 常用信号

  • clicked(): 按钮被点击时发射
  • pressed(): 按钮被按下时发射
  • released(): 按钮被释放时发射
  • toggled(bool checked): 按钮选中状态改变时发射

1.3QButtonGroup 按钮组

用于管理多个按钮的互斥或多选逻辑。

创建按钮组

cpp 复制代码
// 堆内存+手动创建
QButtonGroup::​QButtonGroup(QObject * parent = 0)

添加按钮

cpp 复制代码
// 参数1:要添加的按钮
// 参数2:组中的编号,非重复的正数
void QButtonGroup::​addButton(QAbstractButton * button, int id = -1)


互斥性控制

默认情况下,exclusive属性为true,组内按钮互斥(如单选)。

若需支持多选,需显式设置为false:

cpp 复制代码
group->setExclusive(false);  // 允许多选

示例代码包


二、QComboBox 组合框

提供下拉列表供用户选择,功能类似 QRadioButton(单选),但占用更少的界面空间,适合选项较多或需要紧凑布局的场景。

常用属性

常用信号

示例代码包


三、若干与数字相关的组件

共有属性

minimum (int)

说明:组件允许的最小值

类型:整数

maximum (int)

说明:组件允许的最大值

类型:整数

value (int)

说明:组件的当前值(必须在 minimum 和 maximum 范围内)

类型:整数

共有信号

valueChanged(int i)

触发条件:当组件的 value 值发生变化时发射。

参数:i 表示变化后的新值。

cpp 复制代码
// value值变化时发射的信号
void	valueChanged(int i)            [signal]

代码示例:

当拖动QDial组件的时候,其它进度条会一起变动
示例包


四、QString 字符串类

基本特性

Qt框架中的字符串类,采用Unicode编码

每个字符用16位的QChar表示,支持多语言字符(如中文、日文等)

高度兼容标准C++的字符串API

英文名称 中文解释
append 向后追加
at 取出元素
begin 获取开始位置的迭代器
clear 清空
compare 比较
contains 包含
count 数量
endsWith 以...结尾
fill 每个元素填充
indexOf 出现的位置序号
insert 插入
isEmpty/isNull 是否为空,注意二者有差别
lastIndexOf 最后一次出现的位置下标
length 长度
prepend 向前追加
push_back 向后追加
push_front 向前追加
remove 移除
replace 替换
size 大小
split 分割
startsWith 以...开始
swap 交换
trimmed 去除空格
truncate 截取

核心功能

cpp 复制代码
// 数字 → QString
// 参数1:要转换的数字
// 参数2:进制(默认10进制)
// 返回值:转换后的字符串
QString QString::number(long n, int base = 10) [static]
// QString → int
// 参数1:bool指针接收转换成功状态(可选)
// 参数2:进制(默认10进制)
// 返回值:转换后的数字(失败返回0)
int QString::toInt(bool *ok = nullptr, int base = 10) const

代码示例解析

cpp 复制代码
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>  // 添加调试输出头文件

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    // 示例1:多语言字符处理
    QString text = "あいうえお你好";  // 混合日文和中文
    qDebug() << "字符数量:" << text.count();  // 输出:7(每个字符占1个计数)

    // 示例2:数字转字符串(3进制)
    int count = 23;
    text = QString::number(count, 3);  // 23的三进制表示
    qDebug() << "三进制字符串:" << text;  // 输出:"212"

    // 示例3:字符串转数字(带错误检查)
    text = "0";
    bool convertSuccess = false;
    count = text.toInt(&convertSuccess, 10);  // 十进制转换

    if(convertSuccess) {
        qDebug() << "转换成功:" << count;  // 输出:转换成功:0
    } else {
        qDebug() << "转换失败:" << count;  // 若text="abc",此处输出失败且count=0
    }
}

Dialog::~Dialog()
{
    delete ui;  // 清理UI资源
}

五、Qt容器类

Qt的容器类相比于C++的STL中的容器类更轻巧、安全和易于使用。

5.1 顺序容器 QList

示例: 使用QList存储自定义类Student

  1. 在Qt Creator中:
    • 右键项目 → "添加新文件"
    • 选择创建"C++类"
  2. 在弹出的窗口中:
    • 编写类名
  3. 项目管理界面:
    • 直接点击"完成"
  4. 编辑文件:
    • 在生成的头文件/源文件中编写类内容

Student + QList示例

代码包


5.2 关联容器 QMap

QMap示例
代码包


六、QVariant

QVariant 是 Qt 中用于通用类型存储和转换的类,能够封装 Qt 常见类型(如 int、QString、QList 等),并在需要时进行类型转换。其核心作用是提高函数的参数和返回值兼容性。

核心功能

  • 存储任意类型

  • 可保存 Qt 内置类型(如 QString、int、bool、QSize 等)及自定义类型(需通过 Q_DECLARE_METATYPE 注册)。

    类型安全转换

  • 提供 toXxx() 方法将存储的值转换为目标类型,若类型不匹配返回默认值(如 toInt() 失败返回 0)。

    运行时类型检查

  • 通过 type() 或 userType() 获取当前存储的实际类型(如 QVariant::String)。

基本用法

  1. Qt 类型 → QVariant
    直接通过构造函数或 setValue() 存储:
cpp 复制代码
QVariant v1(42);            // 存储 int
QVariant v2("Hello");       // 存储 QString
QVariant v3 = QSize(100, 50); // 存储 QSize
  1. QVariant → Qt 类型
    调用 toXxx() 方法转换:
cpp 复制代码
int num = v1.toInt();          // 42
QString text = v2.toString();  // "Hello"
QSize size = v3.toSize();      // QSize(100, 50)
  1. 类型检查与默认值
cpp 复制代码
if (v1.canConvert<int>()) {
    int num = v1.toInt(); // 安全转换
}
QDate date = v4.toDate(QDate(2000, 1, 1)); // 转换失败返回默认值

七、跨平台数据类型

由于C++基础数据类型在不同平台/编译器下存在差异(如intlong等长度可能变化),Qt提供了以下跨平台类型保证一致性

7.1 基础数据类型

Qt 类型 等价C++类型 字节长度 说明
qint8 int8_t 1 有符号8位整数
quint8 uint8_t 1 无符号8位整数
qint16 int16_t 2 有符号16位整数
quint16 uint16_t 2 无符号16位整数
qint32 int32_t 4 有符号32位整数
quint32 uint32_t 4 无符号32位整数
qint64 int64_t 8 有符号64位整数
quint64 uint64_t 8 无符号64位整数
qreal double 8(*) 浮点数(多数平台为double)

*注:qreal 在多数平台是double(8字节),但在ARM架构可能为float(4字节)


7.2 特殊用途类型

Qt 类型 说明
qintptr 指针大小的有符号整数(内存地址)
quintptr 指针大小的无符号整数
qsizetype 大小相关的类型(如容器尺寸)
qfloat16 半精度浮点(Qt 6.0+)

7.3 字符类型

Qt 类型 等价C++类型 说明
QChar char16_t UTF-16字符(2字节)
char8_t C++20标准 UTF-8字符(Qt 6.0+支持)

八、QDateTime 日期时间类

Qt提供QDate处理日期、QTime处理时间,而QDateTime同时处理日期和时间。

8.1 常用函数

获取当前时间戳(毫秒)

cpp 复制代码
qint64 QDateTime::currentMSecsSinceEpoch() [static]
返回从1970-01-01 00:00:00(UTC)到当前的毫秒数(时间戳)。

获取当前日期时间

cpp 复制代码
QDateTime QDateTime::currentDateTime() [static]
返回包含当前系统日期和时间的QDateTime对象。

日期时间转字符串

cpp 复制代码
QString QDateTime::toString(const QString &format) const

将QDateTime按指定格式转换为字符串,例如:

cpp 复制代码
QDateTime now = QDateTime::currentDateTime();
QString str = now.toString("yyyy-MM-dd hh:mm:ss"); // 输出:2023-08-25 14:30:45

8.2 常用格式符

符号 含义 示例
yy 两位年份 23
yyyy 四位年份 2023
M 月份 (无前导零) 8
MM 月份(两位) 08
d 日(无前导零) 5
dd 日(两位) 05
h 小时(12小时制) 2
hh 小时(两位,12小时制) 02
H 小时(24小时制) 14
HH 小时(两位,24小时制) 14
m 分钟(无前导零) 3
mm 分钟(两位) 03
s 秒(无前导零) 5
ss 秒(两位) 05
AP AM/PM 标识 PM

8.3 相关组件

QDateEdit

用于编辑日期的输入框,支持日期选择器。
QTimeEdit

用于编辑时间的输入框,支持时间选择。
QDateTimeEdit

结合日期和时间的输入组件。
QCalendarWidget

提供图形化日历界面,用于选择日期。

8.4 代码示例

代码包(新版qt运行不了这个,要用老版本)


九、QTimer 定时器类

QTimer 是 Qt 提供的定时器类,用于处理周期性或一次性(延时)的任务。

9.1 主要属性

属性 类型 描述
active const bool 定时器是否在运行
interval int 间隔时间,单位毫秒
singleShot bool 是否是一次性定时器

9.2 常用函数

构造函数

cpp 复制代码
QTimer::QTimer(QObject *parent = nullptr)

主要槽函数

cpp 复制代码
// 启动定时器,如果定时器已经运行,则会停止并重新运行
void QTimer::start() [slot]
// 停止定时器
void QTimer::stop() [slot]

信号

cpp 复制代码
// 定时器超时信号(到点了的通知信号)
void QTimer::timeout() [signal]

9.3 代码示例

代码包


总结

本文全面解析了Qt框架中的核心UI组件和功能类,首先介绍了QAbstractButton按钮基类及其子类(QPushButton、QCheckBox等)的属性和信号机制,详细说明了QButtonGroup的互斥控制实现;接着深入讲解了QComboBox下拉列表的紧凑布局优势,分析了数字组件(QSlider、QSpinBox等)的共有属性和联动逻辑;在数据处理部分,重点剖析了QString的多语言编码支持和类型转换方法,对比了QList顺序容器与QMap关联容器的使用场景;此外还详解了QVariant的通用类型存储机制、Qt跨平台数据类型的兼容性设计、QDateTime的日期时间处理技巧以及QTimer定时器的周期任务实现方案,通过多个代码示例包和可视化图表展示了各类组件的实际应用场景。

相关推荐
仍然.1 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐5 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99997 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
晚霞的不甘10 分钟前
Flutter for OpenHarmony 构建简洁高效的待办事项应用 实战解析
flutter·ui·前端框架·交互·鸿蒙
自不量力的A同学39 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.41 分钟前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
方见华Richard1 小时前
世毫九实验室技术优势拆解与对比分析(2026)
人工智能·交互·学习方法·原型模式·空间计算
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议