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()
相关推荐
ZJU_统一阿萨姆1 小时前
【推理优化进阶】Hopper_Blackwell 微架构:从指令、流水线到真实性能上限
开发语言·人工智能·语言模型·架构·开源
比奇堡裤头村1 小时前
统计学习方法——支持向量机
算法·支持向量机·学习方法
兵哥工控1 小时前
mfc实现在数值范围内实时改变静态文本控件字体颜色实例
c++·mfc
程序喵大人3 小时前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象
致Great8 小时前
DeepSeek Harness插件开发实战教程:我让它自己写了一个 arXiv 搜索插件
算法
ShineWinsu9 小时前
对于C++:auto_ptr、unique_ptr、shared_ptr的模拟实现
c++·面试·笔试·智能指针·unique_ptr·shared_ptr·auto_ptr
hsjiasb9 小时前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
丰锋ff10 小时前
3.1 Qt事件之事件处理器
开发语言·qt
多弗朗皮卡丘10 小时前
C语言梦开始的地方7:函数
c语言·开发语言