# QDialog 教学综合示例(qt_dialog_showcase) 参考川大 wiki「6 对话框 QDialog」(pageId 183664881) 的 **6.2–6.5**,形态为一个 **QWidget 布满 pushbutton**:每个按钮触发一种 `QDialog` 行为。纯代码(无 `.ui`),主类不 定义信号槽,全部用 lambda 连接 `QPushButton::clicked`。 > 仓库 `p03/ch06` 已有零散单行为示例(modal_dialog / modeless_dialog_* / message_box_* / > file_dialog);本示例是**综合演示**,把页面的全部行为聚到一个窗口对照体验。 ## 16 个按钮 ↔ 页面行为 ### ① 模态 / 非模态(6.3) | 按钮 | 行为 | 关键 API / 要点 | |---|---|---| | 模态 exec | `QDialog::exec()` | 应用级模态,阻塞整个应用直到关闭 | | 窗口模态 open | `QDialog::open()` | 窗口级模态,仅阻塞父窗口 | | 非模态 show | `new QDialog->show()` | 非模态,立即返回;**栈对象会一闪而过**(6.3 的坑) | | 非模态+删除关闭 | `setAttribute(WA_DeleteOnClose)+show()` | 关闭即 delete,避免无 parent 堆对象泄漏 | ### ② QMessageBox(6.4) | 按钮 | 行为 | |---|---| | about / aboutQt / critical / information / question / warning | 六个 static 函数 | | 自定义消息框 | 实例 API:`setIcon / setText / setInformativeText / setDetailedText / setStandardButtons / setDefaultButton` + `exec` | ### ③ 标准对话框(6.2 / 6.5) | 按钮 | 行为 | |---|---| | 打开文件 | `QFileDialog::getOpenFileName` | | 保存文件 | `QFileDialog::getSaveFileName` | | 选颜色 | `QColorDialog::getColor` | | 选字体 | `QFontDialog::getFont` | | 输入文字 | `QInputDialog::getText` | 底部 `QLabel` 显示标准对话框 / question / 自定义消息框的返回值。 ## 关键教学点 - **exec vs open vs show**:三种模态/非模态实现,对应 6.3。`exec()` 阻塞整个应用; `open()` 阻塞父窗口;`show()` 不阻塞。 - **栈对象坑(6.3)**:`QDialog d; d.show();` 在函数返回时 `d` 析构,对话框立即消失 → 必须用堆对象(`new`)。 - **WA_DeleteOnClose(6.3)**:无 parent 的堆对象靠它在关闭时自动 `delete`,避免内存泄漏。 - **QMessageBox static vs 实例(6.4)**:static(about / question / …)调用最简;实例 API 可设详细文本(`setDetailedText` 出现「显示详情...」按钮)与任意按钮组合。 - **标准对话框统一风格(6.2/6.5)**:`QFileDialog / QColorDialog / QFontDialog / QInputDialog` 都是 `get...` static,返回用户选择,`isEmpty()`/`isValid()`/`&ok` 判断是否取消。 ## 目录结构 ``` qdialog_showcase/ ├── qt_dialog_showcase.cpp # DialogShowcase : QWidget(无 Q_OBJECT,纯 lambda)+ main └── README.md # 本文档 ``` ## 构建与运行(Windows + MinGW 7.3.0 + Qt 5.14.2) > 必须用与 Qt 5.14.2 ABI 匹配的 mingw730_64,不可用 PATH 中更高版本的 g++。 ```bash # 配置(在仓库根) cmake -S . -B build_mw -G "MinGW Makefiles" \ -DCMAKE_PREFIX_PATH=E:/Qt/Qt5.14.2/5.14.2/mingw73_64 \ -DCMAKE_CXX_COMPILER=E:/Qt/Qt5.14.2/Tools/mingw730_64/bin/g++.exe \ -DCMAKE_C_COMPILER=E:/Qt/Qt5.14.2/Tools/mingw730_64/bin/gcc.exe # 构建单目标 cmake --build build_mw --target qt_dialog_showcase # 运行(GUI,逐个点按钮体验) PATH=/e/Qt/Qt5.14.2/5.14.2/mingw73_64/bin:$PATH \ QT_QPA_PLATFORM_PLUGIN_PATH=/e/Qt/Qt5.14.2/5.14.2/mingw73_64/plugins/platforms \ ./build_mw/docs/teaching/examples/qt_dialog_showcase.exe # 离屏自动退出验证(不点按钮,退出码应为 0) QT_QPA_PLATFORM=offscreen \ QT_QPA_PLATFORM_PLUGIN_PATH=/e/Qt/Qt5.14.2/5.14.2/mingw73_64/plugins/platforms \ PATH=/e/Qt/Qt5.14.2/5.14.2/mingw73_64/bin:$PATH \ ./build_mw/docs/teaching/examples/qt_dialog_showcase.exe; echo "exit=$?" ```