6d1895d696
- pitfall_stack_widget / pitfall_lambda_capture / pitfall_double_connect: 默认跑正确写法(离屏验证退出码 0),--crash / --dangle 开关课堂现场触发 真实崩溃/悬空访问 - table_widget:QTableWidget 单元格事件最小示例(新安排 Day4「表格事件」) - student_manager:Day5 综合案例参考实现,离屏自测覆盖 JSON round-trip 与 QThread 后台导入闭环 - 均接入 examples/CMakeLists.txt 的 add_teaching_example,手工维护区不影响生成器
45 lines
2.0 KiB
Markdown
45 lines
2.0 KiB
Markdown
# QTableWidget 表格与单元格事件 —— 教学补充示例
|
||
|
||
> 对应教案 [`OUTLINE_4DAY.md`](../../OUTLINE_4DAY.md) Day4 上午「表格」环节
|
||
> (新版 10 天安排原文「绘图事件及表格事件」)。手工维护,非生成产物。
|
||
|
||
## 概念
|
||
|
||
Qt 展示表格数据有两条路线:
|
||
|
||
- **item 类控件(本示例)**:`QTableWidget`——数据直接塞进控件
|
||
(`QTableWidgetItem`),上手快,中小项目够用;
|
||
- **Model/View 架构(延伸钩子)**:数据(model)与展示(view)彻底分离,
|
||
同一模型可喂多个视图,见 [`../model_view/`](../model_view/README.md)。
|
||
|
||
「表格事件」以**信号**形式暴露:`cellClicked` / `cellDoubleClicked` /
|
||
`itemChanged`(编辑单元格后触发)……常规交互不需要重写 `event` 函数。
|
||
|
||
## 代码走读
|
||
|
||
见 [`qt_table_widget_basics.cpp`](qt_table_widget_basics.cpp):
|
||
|
||
1. 构造 3×3 表格,`setHorizontalHeaderLabels` 设列头,列宽 `Stretch` 自适应;
|
||
2. 每个单元格一个 `QTableWidgetItem`,`new` 出来交给表格接管所有权
|
||
(又是父子所有权模型——第几次出现了?);
|
||
3. `cellClicked` 连成员函数槽、`itemChanged` 连 lambda(注意第五参数传了
|
||
`this`,呼应 Day2 坑卡),点击/编辑结果显示在下方 `QLabel`。
|
||
|
||
## 验证方式
|
||
|
||
```bash
|
||
QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_table_widget_basics # 离屏跑通,200ms 自动退出
|
||
tools/run_qt.sh qt_table_widget_basics # 有 X 环境:点击/编辑单元格看状态栏变化
|
||
```
|
||
|
||
## 练习方向(供任务卡引用)
|
||
|
||
- 加一个「添加行」按钮:`insertRow` + 三个新 item;
|
||
- 双击某行弹 `QMessageBox` 显示整行内容(`cellDoubleClicked`);
|
||
- 进阶:改用 `../model_view/` 的做法重做本例,体会两条路线的差异。
|
||
|
||
## 参考
|
||
|
||
- 本仓库对照:[`../model_view/qt_model_view_basics.cpp`](../model_view/qt_model_view_basics.cpp)
|
||
- 综合运用:[`../student_manager/`](../student_manager/README.md)(Day5 案例的核心控件就是它)
|