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 QTreeWidgetItem、itemChanged()、parent()/child()
相关推荐
咖啡忍者10 分钟前
【SAP BASIS】Section 5: SAP System Configuration
笔记
阳明山水20 分钟前
因果一致性正则化实战解析
人工智能·深度学习·算法·机器学习·架构
Yunovian35 分钟前
AI时代,针对模型与应用,浅谈一下各编程语言
开发语言·c++·人工智能·python·ai·rust·ai编程
黄金龙PLUS1 小时前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
周杰伦fans2 小时前
构建真正智能的CAD AI绘图代理
开发语言·人工智能·c#
心中有你02142 小时前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
Omics Pro3 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
Quz3 小时前
QML TreeView:排序与搜索过滤
qt
zhanghaha13144 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
Quz4 小时前
QML TreeView:基础树视图与自定义委托
qt