2. 了解Qt

九、QDateTime 与 QTimer(日期时间与定时器)

9.1 QDateTime(日期时间)

复制代码
 #include <QDateTime>
 ​
 // 获取当前系统时间
 QDateTime now = QDateTime::currentDateTime();
 ​
 // 提取日期/时间部分
 QDate date = now.date();   // 日期部分
 QTime time = now.time();   // 时间部分
 ​
 // 格式化输出
 QString str = now.toString("yyyy-MM-dd hh:mm:ss");
 // 结果如:"2025-01-15 14:30:25"

9.2 QTimer(定时器)

方法 说明
start(毫秒) 启动定时器,每经过指定毫秒触发一次 timeout()
stop() 停止定时器
setSingleShot(true) 设置为单次触发(只触发一次)
setSingleShot(false) 设置为周期触发(默认)
复制代码
 QTimer *timer = new QTimer(this);
 ​
 // 周期性执行:每1000ms触发一次
 timer->start(1000);
 connect(timer, &QTimer::timeout, this, [=]() {
     qDebug() << "定时器触发";
 });
 ​
 // 单次触发:5秒后执行一次
 timer->setSingleShot(true);
 timer->start(5000);

💡 对应控件QDateTimeEdit / QDateEdit / QTimeEdit 用于界面上的日期时间选择。


十、QTextBrowser(文本浏览器)

10.1 核心特性

特性 说明
只读 继承自 QTextEdit,但内容是只读的(用户无法编辑)
超链接支持 QTextEdit 多了链接点击跳转功能
导航 提供 backward()forward()home() 实现浏览历史翻页

10.2 常用属性

属性 说明
openExternalLinks 是否允许点击链接时用外部浏览器打开(如系统默认浏览器)
openLinks 是否允许点击链接
readOnly 只读模式(始终为 true
source 当前显示的文档来源(URL或文件路径)
复制代码
 // 设置文本
 ui->textBrowser->setText("<h1>标题</h1><p>内容</p>");
 ​
 // 设置来源(可加载本地HTML文件)
 ui->textBrowser->setSource(QUrl::fromLocalFile("/path/to/file.html"));
 ​
 // 开启外部链接
 ui->textBrowser->setOpenExternalLinks(true);

十一、QWidget 与父子机制(内存管理核心)

11.1 父子关系规则

场景 效果 内存管理
无父对象 独立窗口(有边框、标题栏) 需手动 delete
有父对象 子窗口部件(显示在父窗口内部,无边框) 父对象自动管理 ,无需手动 delete
复制代码
 // 无父对象:独立窗口,需手动删除
 QWidget *window = new QWidget();
 window->show();
 // ... 使用完毕
 delete window;  // ⚠️ 必须手动释放
 ​
 // 有父对象:子部件,父窗口自动管理
 QWidget *parent = new QWidget();
 QPushButton *btn = new QPushButton("Click", parent);  // parent 是父对象
 // btn 会随 parent 销毁而自动销毁,无需手动 delete

11.2 构造函数

复制代码
 QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = 0);

黄金法则 :只有没有父对象 的组件才需要手动 delete;有父对象的一律交给父对象管理。


十二、QTableView vs QTableWidget(表格控件对比)

12.1 核心区别

对比项 QTableWidget QTableView
继承关系 继承自 QTableView 基础视图类
数据来源 自带数据存储(QTableWidgetItem 通过 setModel() 绑定外部数据模型
setModel() ❌ 私有函数,不能用 ✅ 公开函数,必须用
适用场景 少量静态数据、简单表格 大量数据、数据库绑定(QSqlTableModel
复选框 QTableWidgetItem::setCheckState() 需通过模型自定义
数据库绑定 ❌ 不支持 ✅ 可与 QSqlTableModel 绑定

12.2 代码示例

复制代码
 // ========== QTableWidget(简单数据) ==========
 QTableWidget *tableWidget = new QTableWidget(3, 2);  // 3行2列
 tableWidget->setItem(0, 0, new QTableWidgetItem("姓名"));
 tableWidget->setItem(0, 1, new QTableWidgetItem("年龄"));
 ​
 // 添加复选框
 QTableWidgetItem *checkItem = new QTableWidgetItem();
 checkItem->setCheckState(Qt::Checked);
 tableWidget->setItem(1, 0, checkItem);
 ​
 // ========== QTableView(模型绑定) ==========
 QTableView *tableView = new QTableView();
 QStandardItemModel *model = new QStandardItemModel(3, 2, this);  // ⚠️ 必须用指针
 model->setHeaderData(0, Qt::Horizontal, "姓名");
 model->setData(model->index(0, 0), "张三");
 tableView->setModel(model);  // 绑定模型

关键点 :视图与模型绑定时,模型必须用 new 创建(指针),否则视图不能随模型改变而更新。


十三、QTreeWidget 树形控件(带复选框)

13.1 节点操作

复制代码
 // 创建树形控件
 QTreeWidget *tree = new QTreeWidget(this);
 tree->setHeaderLabel("分类");
 ​
 // 创建根节点
 QTreeWidgetItem *root = new QTreeWidgetItem(tree);
 root->setText(0, "根目录");
 ​
 // 创建子节点
 QTreeWidgetItem *child = new QTreeWidgetItem(root);
 child->setText(0, "子目录1");
 ​
 QTreeWidgetItem *child2 = new QTreeWidgetItem(root);
 child2->setText(0, "子目录2");

13.2 添加复选框

复制代码
 QTreeWidgetItem *item = new QTreeWidgetItem(root);
 item->setText(0, "可选项");
 ​
 // 开启复选框功能
 item->setFlags(Qt::ItemIsUserCheckable |   // 可勾选
                Qt::ItemIsEnabled |          // 启用
                Qt::ItemIsSelectable);       // 可选中
 ​
 // 设置勾选状态
 item->setCheckState(0, Qt::Checked);  // 勾选
 // item->setCheckState(0, Qt::Unchecked);  // 取消勾选

13.3 信号与节点遍历

复制代码
 // 信号:节点状态变化时触发
 connect(tree, &QTreeWidget::itemChanged,
         this, [=](QTreeWidgetItem *item, int column) {
     if (item->checkState(0) == Qt::Checked) {
         qDebug() << "勾选了:" << item->text(0);
     }
 });
 ​
 // 访问父节点与子节点
 QTreeWidgetItem *parent = item->parent();           // 取父节点
 QTreeWidgetItem *firstChild = item->child(0);       // 取第一个子节点
 int childCount = item->childCount();                // 子节点数量
 ​
 // 遍历所有子节点
 for (int i = 0; i < item->childCount(); i++) {
     QTreeWidgetItem *child = item->child(i);
     // 处理 child...
 }

13.4 常用标志位速查

标志 说明
Qt::ItemIsUserCheckable 允许用户勾选(显示复选框)
Qt::ItemIsEnabled 启用状态
Qt::ItemIsSelectable 允许被选中
Qt::ItemIsEditable 允许编辑

📌 速查表汇总

模块 核心类 关键方法/信号
日期时间 QDateTime currentDateTime()date()time()
定时器 QTimer start()stop()timeout()setSingleShot()
文本浏览器 QTextBrowser setText()setSource()backward()forward()
父窗口机制 QWidget 无父需手动 delete,有父自动管理
表格(简单) QTableWidget setItem()QTableWidgetItem
表格(数据库) QTableView setModel()(模型必须用 new
树形控件 QTreeWidget QTreeWidgetItemitemChanged()parent()/child()
相关推荐
a187927218315 小时前
【算法】动态规划第五篇:区间 DP——从“看什么都像背包“到“最后戳谁“
算法·leetcode·动态规划·dp·区间·区间dp·算法讲解
键盘会跳舞5 小时前
【C++多线程】thread_local 深度剖析:线程局部存储的生命周期与实现
c++·多线程·thread_local
whitelbwwww5 小时前
c++ 多线程
开发语言·c++·算法
额鹅恶饿呃5 小时前
随着CentOS官方停服的时间越来越久,大量仍在使用CentOS7的企业和运维从业者
java·python·算法·c#·ruby
乌药ice5 小时前
c#中一个多线程安全的HashSet
开发语言·c#
秋名RG5 小时前
Java 异常处理全攻略:从入门到实战(JDK 21 版)
java·开发语言
白狐_7985 小时前
408 数据结构|KMP算法核心:为什么不用主串回退
数据结构·算法
努力努力再努力wz5 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构
wuyk5555 小时前
13.堆排序:基于完全二叉树的高效排序算法一、什么是堆排序?
开发语言·算法·排序算法
runningshark5 小时前
Lecture: The ‘Why & How‘ Principle: Moving Beyond Simple Statements
开发语言·前端·javascript