Qt每日教学 · 2026-07-03

📋 任务:Qt每日教学 📅 日期:2026-07-08 🕐 生成时间:2026-07-08 00:00:51
Job ID: 6e91a749f5a4 Run Time: 2026-07-03 22:03:52 Schedule: 0 9-22/3 *

Prompt

[IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]

首先运行进度追踪脚本:

`bash

bash /home/ubuntu/.qt_teach_progress.sh

cat /tmp/qt_teach_progress.txt

`

然后从输出中读取 NEXT_INDEX 的值,根据该编号选择对应的知识点进行精讲。

知识点编号对照表:

【框架初识】

  1. Qt 对象树与 parent 指针(内存自动回收)
  2. QApplication 与事件循环 exec()
  3. moc(元对象编译器)与信号槽的"魔法"

【信号与槽】

  1. 信号槽 connect 五种重载(新式语法)
  2. 自定义信号与 emit
  3. 信号槽连接类型(Qt::AutoConnection 等)
  4. Lambda 表达式作槽函数(含捕获陷阱)

【UI 基础】

  1. QWidget 与 QMainWindow 的区别
  2. 布局管理器(QVBoxLayout / QHBoxLayout / QGridLayout)
  3. 栅格布局伸缩因子(stretch)与间距控制

【常用控件】

  1. QPushButton 与 clicked() / pressed() / released()
  2. QLineEdit 的 inputMask 与 validator 校验
  3. QLabel 显示文字/图片/HTML
  4. QComboBox 的 addItem 与 currentIndexChanged
  5. QListWidget / QTableWidget / QTreeWidget(简易数据展示)

【事件系统】

  1. 事件(QEvent)与信号的区别
  2. 重写 keyPressEvent 处理键盘
  3. 鼠标事件(mousePressEvent / mouseMoveEvent)
  4. 事件过滤器(installEventFilter)与 eventFilter()

【绘图与样式】

  1. QPainter 基本绘图(画线/矩形/文字)
  2. QSS(Qt 样式表)改变控件外观
  3. QPixmap 与 QImage 加载显示图片

【文件与资源】

  1. QFile 读写文本文件(QTextStream)
  2. QSettings 保存配置(ini / 注册表)
  3. 资源系统(: /qrc 前缀)与内置图片

【多线程与定时】

  1. QTimer 单次/周期触发(与事件循环)
  2. moveToThread 的线程安全写法
  3. QMutex 与 QMutexLocker 简单互斥

【容器与字符串】

  1. QString 与 std::string 互转(toStdString / fromStdString)
  2. QString 的 arg() 格式化与 number() 转换
  3. QList / QVector 区别及 foreach(不推荐)

【进阶特性】

  1. 属性系统(Q_PROPERTY)与动态属性
  2. QMetaObject 与 invokeMethod(跨线程调用)
  3. 自定义控件(继承 QWidget 并重写 paintEvent)
  4. Qt 智能指针(QSharedPointer / QScopedPointer)概览

输出格式(严格按此结构,总字数控制在1000字内,确保5分钟读完):


📘 今日课题:[知识点名称](难度:⭐ / ⭐⭐)

🤔 为什么需要它?

(用60字说明这个知识解决了什么编程痛点,不堆砌概念)

🏠 人间烟火类比

(用一个生活场景彻底讲透核心思想,30字左右)

🔍 核心代码剖析(约15~20行)

`cpp

// 带详细中文注释,展示最典型用法和反例

`

💡 关键提醒:(一句话点出最容易踩的坑)

注意:

Response

NEXT_INDEX=1,对应知识点:Qt 对象树与 parent 指针(内存自动回收)


📘 今日课题:Qt 对象树与 parent 指针(内存自动回收)(难度:⭐)

🤔 为什么需要它?

C++ 中最头疼的就是内存泄漏——new 出来的东西忘了 delete。Qt 通过对象树机制,让你几乎不用手动管理父对象子对象的内存,子对象销毁时机由父对象自动掌控,彻底告别"谁该 delete 谁"的纠结。

🏠 人间烟火类比

就像父母养孩子:父母在世时,孩子自然被照顾;父母不在了(被销毁),孩子也跟着离开(自动清理)。你不需要操心每个孩子什么时候该"放手",父母负责兜底。

核心代码剖析

`cpp

#include <QWidget>

#include <QPushButton>

int main(int argc, char* argv[]) {

// QApplication 是所有对象的根,没有 parent

QApplication app(argc, argv);

// 创建窗口,parent 为 nullptr,它是顶层窗口

QWidget window;

// 按钮以 window 为 parent,加入对象树

QPushButton* btn = new QPushButton("点击我", &window);

// 按钮也接受一个子标签,标签以按钮为 parent

QLabel* label = new QLabel("提示", btn);

window.show();

int ret = app.exec(); // 进入事件循环

// 当 window 被销毁时,Qt 自动递归删除其所有子对象:

// window 析构 → 自动 delete btn → btn 析构 → 自动 delete label

// 无需手动 delete,不会内存泄漏

return ret;

}

// 常见误区:

// 1. 给已有 parent 的对象再次 setParent(newParent) —— 可以,

// 但对象会从旧 parent 的子列表中移除,加入新 parent。

// 2. 手动 delete 有 parent 的子对象 —— 会导致 double free!

// 子对象的生命周期由 parent 管理,不该手动释放。

// 3. 局部变量指针指向堆上新建的 widget,函数结束就泄漏了,

// 因为没设 parent,对象树不会追踪它。

`

关键提醒

记住一条铁律:只要给 new 出来的 QObject 子类设置了 parent,就永远不要再手动 delete 它——parent 会替你收拾残局。

📌 进度已更新,下一课将从第 2 项开始。