九、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);
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;有父对象的一律交给父对象管理。
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 创建(指针),否则视图不能随模型改变而更新。
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() |