当前位置: 首页 > news >正文

26.QT手撸布局+基础控件模板

纯代码写 UI 的优点

1. 工程更干净,无冗余文件

  • 没有.ui界面文件、没有 uic 编译器自动生成的ui_xxx.h中间代码;
  • 整个项目只有.h.cpp,版本管理(Git)更清爽,不会出现 UI 文件 XML 冲突;
  • 多人协作时,几乎不会出现 UI 文件合并冲突,拖拽界面经常出现乱码、布局错乱的合并问题,纯代码完全规避。

2. 高度可控,界面逻辑一体化

  • 界面创建、参数设置、信号绑定直接写在构造函数里,界面和业务代码放在一起,不用来回切换 UI 设计器和代码;
  • 可以动态生成界面:根据配置文件、网络数据、用户权限,在运行时动态创建 / 销毁 / 增删控件。拖拽 UI 只能写死固定界面,运行时想批量生成几十个按钮、表格列,只能靠代码,纯代码写法天然适配动态界面。

3. 编译更快,减少头文件依赖

配合前置声明(class QPushButton;),头文件不需要引入一大堆控件头,减少头文件嵌套,大型项目编译速度提升明显;不会因为包含过多 UI 头文件造成循环包含问题。

4. 便于封装与复用

可以把一组控件 + 布局封装成一个自定义控件类,写成独立组件,在多个窗口直接 new 调用;纯代码组件移植性极强,复制类文件就能复用,不用连带复制 ui 文件。

5. 方便版本回滚与代码审查

所有界面改动都是 C++ 代码改动,Git 可以清晰看到:哪一行新增了按钮、修改了布局间距、调整了控件大小;拖拽 UI 保存的是 XML 文本,布局微小改动都会造成整段 XML 变动,很难看清改了什么。

6. 更容易实现精细化自定义

如果要自己重写paintEvent绘制控件、自定义鼠标交互、做异形窗口、动画切换界面,纯代码连贯开发更顺畅;不用在设计师里摆放控件再去写自定义逻辑,前后代码无缝衔接。

7. 跨平台部署更省心

少了 uic 编译环节,编译链路更简单,在 Linux、嵌入式 Qt 环境下交叉编译时,少一个编译步骤,不容易出编译环境问题。

缺点:这里暂不讨论

main.cpp:

#include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }

mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QWidget> class QPushButton; class QLabel; class QLineEdit; class QTextEdit; class QPlainTextEdit; class QCheckBox; class QRadioButton; class QComboBox; class QSlider; class QTableWidget; class QTreeWidget; class MainWindow : public QWidget { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); private: QPushButton* m_btn; QLabel* m_label; QLineEdit* m_lineEdit; QTextEdit* m_textEdit; QPlainTextEdit* m_plainEdit; QCheckBox* m_checkBox; QRadioButton* m_radioBtn; QComboBox* m_comboBox; QSlider* m_slider; QTableWidget* m_tableWidget; QTreeWidget* m_treeWidget; }; #endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h" #include <QVBoxLayout> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QTextEdit> #include <QPlainTextEdit> #include <QCheckBox> #include <QRadioButton> #include <QComboBox> #include <QSlider> #include <QTableWidget> #include <QTreeWidget> MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { this->setWindowTitle("test"); this->resize(400, 600); // 1. 创建垂直布局 QVBoxLayout* layout = new QVBoxLayout(this); layout->setSpacing(6); layout->setContentsMargins(10,10,10,10); // 2. 逐个创建控件并加入布局 m_btn = new QPushButton("QPushButton 按钮", this); layout->addWidget(m_btn); m_label = new QLabel("QLabel 文本显示", this); layout->addWidget(m_label); m_lineEdit = new QLineEdit("QLineEdit 单行输入", this); layout->addWidget(m_lineEdit); m_textEdit = new QTextEdit("QTextEdit 富文本多行框", this); m_textEdit->setMaximumHeight(80); layout->addWidget(m_textEdit); m_plainEdit = new QPlainTextEdit("QPlainTextEdit 纯文本多行框", this); m_plainEdit->setMaximumHeight(80); layout->addWidget(m_plainEdit); m_checkBox = new QCheckBox("QCheckBox 复选框", this); layout->addWidget(m_checkBox); m_radioBtn = new QRadioButton("QRadioButton 单选框", this); layout->addWidget(m_radioBtn); m_comboBox = new QComboBox(this); m_comboBox->addItems({"选项1","选项2","选项3"}); layout->addWidget(m_comboBox); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setRange(0,100); layout->addWidget(m_slider); m_tableWidget = new QTableWidget(2,2,this); m_tableWidget->setMaximumHeight(100); m_tableWidget->setHorizontalHeaderLabels({"列1","列2"}); layout->addWidget(m_tableWidget); m_treeWidget = new QTreeWidget(this); m_treeWidget->setMaximumHeight(100); m_treeWidget->setHeaderLabel("树形控件"); layout->addWidget(m_treeWidget); }

最终效果:

http://www.jsqmd.com/news/1090802/

相关文章:

  • Red Panda Dev-C++:如何用这款免费轻量级IDE快速入门C++编程
  • 如何将Amlogic电视盒变身为功能完整的Linux服务器:2025年终极开源解决方案
  • 规范的AI论文工具榜单(2026 实测推荐)
  • Python+Playwright自动化测试:文件下载场景的稳定解决方案
  • 8086 汇编语言从入门到实战:寻址方式 + 经典作业案例深度复盘
  • 如何选择一款真正纯净的免费小说阅读器:ReadCat开源解决方案深度解析
  • 如何快速免费绕过iOS 15-16激活锁:AppleRa1n完整指南
  • DLSS Swapper终极指南:一键智能管理游戏DLSS、FSR、XeSS版本
  • TAS54x4C音频功放故障诊断与负载检测技术详解
  • 探索U校园智能自动化答题:深度解析AutoUnipus技术原理与实战应用
  • Destiny 2单人模式完整指南:如何快速实现独狼游戏体验
  • 系统扩展性设计
  • Untrunc视频修复工具:三步恢复损坏MP4文件的终极指南
  • 智能自动化OpenCore配置工具:OpCore-Simplify让黑苹果配置从3天缩短到15分钟
  • 学术论文写作三部曲:从精准文题到高效检索(文题、摘要、关键词)
  • React Hook 性能调优与状态复用方法
  • Appium自动化测试框架实战:PO模式封装与Maven打包全流程
  • 如何用BiliTools轻松管理B站资源:跨平台工具箱终极指南
  • EMI滤波电感选型常见误区、故障溯源与优化
  • Python自动化解析逻辑分析仪CSV波形:从原始数据到协议包的实战指南
  • 猫抓浏览器扩展:你的网页资源嗅探助手
  • 性能测试工具:JMeter 脚本编写
  • 如何在5分钟内让Obsidian插件说中文:零代码插件汉化终极指南
  • 为什么你的角色扮演总“OOC”?ChatGPT提示词中被忽略的4个语义锚点与动态校准公式
  • codex 借助ccswitch 使用qwen/deepseek/glm5.2
  • 3步轻松下载流媒体视频:HLS Downloader浏览器插件完全指南
  • Web安全攻防:XSS与CSRF漏洞原理、实战复现与防御策略详解
  • TIM 更新事件软件触发场景
  • 解析 Markdown 文档
  • 超级简单好用的C语言Log日志库!!(附代码库下载链接)