南通专业网站建设直通车推广
2026/4/18 1:21:30 网站建设 项目流程
南通专业网站建设,直通车推广,wordpress二级分类别名重名,虹口网站开发Qt 学起来挺有意思的#xff0c;但初学者往往会被一些细节绕晕。 在上一篇博客里#xff0c;我们讲了 Qt 的环境搭建和基础概念#xff0c;这篇我们直接来动手做一个最简单的 HelloWorld#xff0c;顺便把控件的生命周期、堆栈分配、QString 这些关键点顺便梳理一下。一、H…Qt 学起来挺有意思的但初学者往往会被一些细节绕晕。在上一篇博客里我们讲了 Qt 的环境搭建和基础概念这篇我们直接来动手做一个最简单的HelloWorld顺便把控件的生命周期、堆栈分配、QString 这些关键点顺便梳理一下。一、HelloWorld 的两种实现方式在 Qt 中实现 HelloWorld其实就是在窗口上显示一段文本。有两种方式图形化方式使用 Qt Designer拖控件、设置属性纯代码方式直接写 C 代码创建控件两种方式最终效果一样底层都是创建控件对象只不过 Designer 帮你自动生成了代码而已。二、方式一Qt Designer可视化方式1. 打开 UI 设计界面双击widget.uiQt Creator 会进入Qt Designer 模式看到的是可视化窗口而不是代码。2. 拖拽 Label 控件显示 HelloWorld在左侧控件栏找到Label拖动到设计窗口拖拽控件边缘或右下角的小方块可以改变大小在右侧属性编辑器中把text属性改为Hello World这样界面就完成了。3. Qt Designer 的对象树右上角有一个对象树Object Inspector显示当前界面所有控件的层级关系顶层是窗口Widget子节点是 Label 或按钮层级关系 运行时的父子关系也就是说 Designer 里看到的结构运行时会一模一样。4. 拖拽控件背后的机制拖控件后.ui文件会新增一段 XML 代码每个控件都有widget标签记录控件类型、大小、位置等。编译时qmake 会调用 uic 工具把.ui文件生成对应的ui_widget.hC 代码。运行时这些代码帮我们构建界面完全自动化。5. ui_widget.h 中的真实代码打开ui_widget.h可以看到类似labelnewQLabel(Widget);label-setObjectName(QString::fromUtf8(label));label-setGeometry(QRect(220,120,171,91));new QLabel(Widget)→ 创建控件并指定父对象setObjectName→ 给控件命名用于查找或样式匹配setGeometry→ 控件位置和大小这说明Qt Designer 并不是魔法它只是帮你写了这些 C 代码。三、方式二纯代码方式1. 构造函数中创建控件纯代码方式通常把控件创建写在Widget 的构造函数里QLabel*labelnewQLabel(this);label-setText(Hello World);原因很简单构造函数执行时窗口对象已经存在可以安全使用this作为父对象控件会被挂到对象树上生命周期由 Qt 管理不放在构造函数里会很难保证控件能正常显示。2. setText 的 QStringlabel-setText(Hello World);setText接收QString类型QString 是 Qt 自己的字符串类支持 Unicode可以直接传 C 风格字符串隐式转换当初 Qt 诞生时C 还没标准库使用起来并不方便为了更好的开发Qt 自己造了这一套轮子QString、QList、QVector、QMap……即便现在标准库成熟在开发中可以使用标准库类型但这些类依然存在因为他们与 Qt 的框架有着深度绑定不可能删去。而且这些类型也是蛮好用的例如QString内部对字符串编码进行了处理。在 Qt 原生 API 中优先使用 Qt 类型比如 QString比 std::string 更好用。3. 控件默认显示在左上角如果没有手动设置位置或使用布局管理器QLabel*labelnewQLabel(this);控件会默认出现在(0,0)左上角可以用move()或setGeometry()指定位置或者使用布局管理器推荐QVBoxLayout*layoutnewQVBoxLayout(this);layout-addWidget(label);布局管理器会自动处理位置和大小响应窗口缩放。4. 为什么控件要放在堆上QLabel*labelnewQLabel(this);如果写成栈对象QLabellabel(this);构造函数结束后控件就被销毁了窗口显示时控件已经不存在堆对象 parent 指定可以保证控件在父窗口生命周期内一直存在。栈对象仅适合临时控件或数据对象GUI 控件不适合。5. 为什么没有 delete 也不会内存泄漏很多人会疑惑QLabel*labelnewQLabel(this);没有 delete会不会泄漏不会因为我们把 label 挂到了对象树父窗口析构时Qt 会自动释放所有子对象对象树管理生命周期是 Qt 内存管理的重要机制四、小结Qt Designer拖控件、属性编辑背后生成 XML → C 代码纯代码方式手动 new 控件设置 text、几何、布局控件内存管理父对象 对象树 → 自动释放QStringQt 自己的字符串类跨平台、Unicode 支持堆 vs 栈控件必须堆分配否则生命周期过短这就是一个最小可运行的 Qt HelloWorld背后的完整逻辑。两种方式最终效果一样只是你选择用 Designer 还是纯代码看你习惯和场景。↖(ω)↗↖(ω)↗↖(ω)↗

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询