13b3ebbe14
把川大 wiki「02.Qt方向」课程代码整理为 CMake 管理的可编译运行项目。
Part1 C/C++ 强化 (p01/, 144 目标, host gcc/g++ 构建, 全绿):
- 修复全部编译失败:补 <cstring>/<fstream>/<iomanip>/<vector> 等缺失头
(common_fix + infer_stl_includes 自动检测注入)、修正 pause() 壳注入
(改检测已转换后的 pause 调用)、namespace 提升出函数体、const 成员函数
正确性、dedupe 不再破坏函数重载集、K&R 隐式 int / 动态异常规范等
C++17 移除特性的可编译等价改写。
- 目录采用深缩写 p01/ch04/s03/ (原 part1_cpp/ch04_class_object/03_ctor_dtor)。
Part3 Qt 桌面 (p03/, 29 目标, 隔离 Qt 5.14.2 构建, 全绿):
- gen_part3.py: Qt 外壳模板 (main+QApplication+show, QTimer 自动退出便于
offscreen 验证)、AUTOMOC + .moc include、rewrite_* 处理散文混入/重载/
资源依赖、生成占位 png/gif + .qrc + rundata 样例数据。
- 修正 QLable 笔误、全角分号、.→->、Windows 路径、QApplication 阻塞事件
循环改为 QCoreApplication 等。
任务1 概念/版本验证:
- tools/std_probe.py: 跨 -std= 编译探针 (--pedantic-errors 让已废除特性硬失败)。
- tools/demo_versions/: K&R 隐式 int、三目左值、void* 转换、enum 赋整、
const 经指针、动态异常规范 共 6 个跨版本演示。
- docs/VERSION_NOTES.md: 每条「原文说法→C17/C++17 是否成立→何版本成立→已验证」。
文档: 顶层 README、docs/SOURCE_PAGES.md (页面→目录映射)、
docs/ERRATA.md (Part1 修正)、docs/ERRATA_part3.md (Part3 修正)。
另修复 tools/run.sh / run_qt.sh 的 ${1:?...} 引号语法 bug。
隔离 Qt 验证: ldd 0 系统 Qt 引用; 173/173 目标全绿; p03 offscreen 运行通过。
1 line
4.7 KiB
JSON
1 line
4.7 KiB
JSON
{"id":"58954536","type":"page","status":"current","title":"7 布局管理器","version":{"by":{"type":"known","username":"ethanliu","userKey":"2c90931b6cfb654f016d5c69becc0001","profilePicture":{"path":"/images/icons/profilepics/default.svg","width":48,"height":48,"isDefault":true},"displayName":"刘浩","_links":{"self":"https://wiki.suncaper.net/rest/api/user?key=2c90931b6cfb654f016d5c69becc0001"},"_expandable":{"status":""}},"when":"2022-07-09T01:51:25.000Z","message":"","number":1,"minorEdit":false,"hidden":false,"_links":{"self":"https://wiki.suncaper.net/rest/experimental/content/58954536/version/1"},"_expandable":{"content":"/rest/api/content/58954536"}},"body":{"storage":{"value":"<p>所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。<br />\n<span style=\"color: rgb(255,0,0);\"><strong>Qt 提供了两种组件定位机制:绝对定位和布局定位。</strong></span></p>\n<ul>\n\t<li>绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。</li>\n</ul>\n\n\n<p>这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。或者,还有更简单的方法:禁止用户改变窗口大小。但这总不是长远之计。</p>\n<ul>\n\t<li>布局定位:你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。</li>\n</ul>\n\n\n<p>布局定位完美的解决了使用绝对定位的缺陷。<br />\nQt 提供的布局中以下三种是我们最常用的:</p>\n<ul>\n\t<li>QHBoxLayout:按照水平方向从左到右布局;</li>\n\t<li>QVBoxLayout:按照竖直方向从上到下布局;</li>\n\t<li>QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;</li>\n</ul>\n\n\n<h1><ac:structured-macro ac:name=\"anchor\" ac:schema-version=\"1\" ac:macro-id=\"77a21336-b4b5-4b2a-84b6-80a32d528bfb\"><ac:parameter ac:name=\"\">_Toc466556793</ac:parameter></ac:structured-macro><ac:structured-macro ac:name=\"anchor\" ac:schema-version=\"1\" ac:macro-id=\"2abb1215-0dcc-4e38-b622-dc51eacb0597\"><ac:parameter ac:name=\"\">_Toc471842018</ac:parameter></ac:structured-macro>7.1 系统提供的布局控件</h1>\n<p><ac:image ac:height=\"156\" ac:width=\"298\"><ri:attachment ri:filename=\"worddav18ab88afaab13e557090ff7c7f4b8ce0.png\" /></ac:image><br />\n这4个为系统给我们提供的布局的控件,但是使用起来不是非常的灵活,这里就不详细介绍了。</p>\n<h1><ac:structured-macro ac:name=\"anchor\" ac:schema-version=\"1\" ac:macro-id=\"1a671ec2-4963-41a8-a244-1e245b4cab55\"><ac:parameter ac:name=\"\">_Toc471842019</ac:parameter></ac:structured-macro>7.2 利用widget做布局</h1>\n<p>第二种布局方式是利用控件里的widget来做布局,在Containers中<br />\n<ac:image ac:height=\"320\" ac:width=\"279\"><ri:attachment ri:filename=\"worddavb1b05c61db9303f4bd40ca5a09e9f386.png\" /></ac:image><br />\n在widget中的控件可以进行水平、垂直、栅格布局等操作,比较灵活。<br />\n再布局的同时我们需要灵活运用弹簧的特性让我们的布局更加的美观,下面是一个登陆窗口,利用widget可以搭建出如下登陆界面:<br />\n<ac:image ac:height=\"249\" ac:width=\"320\"><ri:attachment ri:filename=\"worddav726822fbe1bdfb789e8987a25380efa3.png\" /></ac:image></p>","representation":"storage","_expandable":{"content":"/rest/api/content/58954536"}},"_expandable":{"editor":"","view":"","export_view":"","styled_view":"","anonymous_export_view":""}},"extensions":{"position":44},"_links":{"webui":"/pages/viewpage.action?pageId=58954536","edit":"/pages/resumedraft.action?draftId=58954536","tinyui":"/x/KJODAw","collection":"/rest/api/content","base":"https://wiki.suncaper.net","context":"","self":"https://wiki.suncaper.net/rest/api/content/58954536"},"_expandable":{"container":"/rest/api/space/2CT","metadata":"","operations":"","children":"/rest/api/content/58954536/child","restrictions":"/rest/api/content/58954536/restriction/byOperation","history":"/rest/api/content/58954536/history","ancestors":"","descendants":"/rest/api/content/58954536/descendant","space":"/rest/api/space/2CT"}} |