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

Qt Widgets 架构与开发入门第四章-第六章

第 4 章 布局管理

写 GUI 时,不要用绝对坐标摆控件,而是把控件交给布局管理器(layout)。窗口一缩放、字体一换、翻译一切换,布局能自动调整,而绝对坐标会立刻崩盘。

4.1 布局的核心思想

  1. List item

布局管理器负责两件事:

  1. 分配几何:根据每个子控件的sizeHint()/sizePolicy()计算出位置和大小。
  2. 传播尺寸约束:把子控件的最小/最大尺寸聚合起来,反馈给父窗口。

一个控件被addWidget()到某个 layout 后,layout 会接管它的几何,你手动move()/resize()会被立即覆盖。

4.2 常用布局

  • QHBoxLayout:水平排列。
  • QVBoxLayout:垂直排列。
  • QGridLayout:网格,支持跨行/跨列。
  • QFormLayout:两列「标签 : 控件」的表单,自动按平台风格对齐。
  • QStackedLayout:同一位置堆叠多页,一次显示一页(常配QStackedWidget)。
auto*root=newQVBoxLayout(this);auto*form=newQFormLayout;form->addRow("姓名:",newQLineEdit);form->addRow("年龄:",newQSpinBox);root->addLayout(form);auto*buttons=newQHBoxLayout;buttons->addStretch();// 把后面的按钮推到右边buttons->addWidget(newQPushButton("确定"));buttons->addWidget(newQPushButton("取消"));root->addLayout(buttons);

传入new QVBoxLayout(this)会把 layout 直接安装到当前 widget 上,等价于setLayout(new QVBoxLayout)

4.3 尺寸策略(SizePolicy)

每个 widget 有一对QSizePolicy,告诉布局「愿不愿意拉伸/压缩」:

  • Fixed:钉死在sizeHint()
  • Minimum:可以比 hint 大,但不能小(如按钮)。
  • Preferred(默认):hint 是理想值,可大可小。
  • Expanding:主动占据剩余空间(如QTextEdit)。
  • MinimumExpandingMaximumIgnored:更专门的场景。

当多个控件都Expanding时,stretch factor决定它们瓜分空间的比例:

layout->addWidget(list,1);// 占 1 份layout->addWidget(editor,3);// 占 3 份

4.4 QSplitter

需要让用户拖动分界线调整两块区域时,用QSplitter而不是普通 layout:

auto*splitter=newQSplitter(Qt::Horizontal);splitter->addWidget(fileTree);splitter->addWidget(editor);splitter->setStretchFactor(1,1);// 右侧优先获得多余空间

4.5 用 Designer 画布局

.ui文件里推荐的做法:

  1. 把所有控件先随意扔到窗口上。
  2. 框选一组控件 → 右键 →Layout→ 选择水平/垂直/网格。
  3. 最外层布局:选中窗口本身 → 右键 →Layout in Grid/Vertical/Horizontal,顶层没设 layout 的窗口无法自动缩放。

一个常见错误:忘记给顶层窗口加 layout,导致运行时窗口一缩放,控件全挤在左上角。


第 5 章 常用控件

Qt Widgets 控件太多,这里只挑最常用的分组介绍,查 API 用Qt Assistant或官方文档最快。

5.1 按钮与选择

  • QPushButton:普通按钮,常用信号clicked()
  • QToolButton:图标按钮,常配QAction
  • QCheckBox:多选,信号toggled(bool)
  • QRadioButton:单选,一组内互斥;用QButtonGroup把跨父控件的一组绑起来。
  • QComboBox:下拉列表,currentIndexChanged(int)currentTextChanged(QString)

5.2 输入控件

  • QLineEdit:单行文本。可设setEchoMode(QLineEdit::Password)setValidator()
  • QTextEdit/QPlainTextEdit:多行文本。前者支持富文本,后者更适合代码/日志(性能好)。
  • QSpinBox/QDoubleSpinBox:数值输入,自带步进。
  • QDateEdit/QTimeEdit/QDateTimeEdit:日期时间,可弹出日历。
  • QSlider/QDial:滑块与旋钮。

5.3 显示控件

  • QLabel:文字或图像,支持简单 HTML。
  • QProgressBar:进度条,设setRange(0, 0)变成「忙碌指示」。
  • QLCDNumber:老式七段数码显示。

5.4 容器控件

  • QGroupBox:带标题的分组框。
  • QTabWidget:标签页。
  • QStackedWidget:堆叠页,setCurrentIndex()切换。
  • QScrollArea:内容超出时提供滚动条。
  • QToolBox:抽屉式分组。

5.5 视图控件(Item Views)

  • QListWidget/QTreeWidget/QTableWidget:便利类,数据直接塞控件,适合 <1 万条的小数据。
  • QListView/QTreeView/QTableView:Model/View 版本,需要单独提供 model,数据量大或需要多视图共享数据时用它们。详见第 8 章。

5.6 一个组合例子

auto*widget=newQWidget;auto*layout=newQFormLayout(widget);auto*nameEdit=newQLineEdit;auto*ageSpin=newQSpinBox;ageSpin->setRange(0,150);auto*okBtn=newQPushButton("提交");layout->addRow("姓名:",nameEdit);layout->addRow("年龄:",ageSpin);layout->addRow(okBtn);QObject::connect(okBtn,&QPushButton::clicked,widget,[=]{qDebug()<<nameEdit->text()<<ageSpin->value();});widget->show();

第 6 章 主窗口:菜单、工具栏、状态栏

QMainWindow是一个预置了菜单栏、工具栏、状态栏、中央区、Dock 区的顶层窗口,大部分桌面应用都以它为骨架。

6.1 结构

┌───────────────── QMenuBar ────────────────┐ ├──────────────── QToolBar(可多个)─────────┤ │ ┌───┐ ┌───┐ │ │ │ D │ CentralWidget │ D │ │ │ │ o │ (setCentralWidget) │ o │ │ │ │ c │ │ c │ │ │ │ k │ │ k │ │ │ └───┘ └───┘ │ ├──────────────── QStatusBar ───────────────┤ └────────────────────────────────────────────┘

6.2 QAction:命令的抽象

菜单项、工具栏按钮、快捷键共用同一个QAction,状态(启用/禁用/勾选)自动同步。

auto*openAct=newQAction(QIcon(":/icons/open.svg"),"打开(&O)...",this);openAct->setShortcut(QKeySequence::Open);// Ctrl+O(跨平台)openAct->setStatusTip("打开一个文件");connect(openAct,&QAction::triggered,this,&MainWindow::openFile);menuBar()->addMenu("文件(&F)")->addAction(openAct);addToolBar("主工具栏")->addAction(openAct);

字符串中的&O定义了助记符(Alt+O)。QKeySequence::Open等标准键在不同平台会自动映射(如 macOS 变成 ⌘O)。

6.3 状态栏

statusBar()->showMessage("就绪",3000);// 3 秒后自动清除statusBar()->addPermanentWidget(newQLabel("行 1, 列 1"));

6.4 Dock 与中央区

auto*dock=newQDockWidget("项目",this);dock->setWidget(projectTree);addDockWidget(Qt::LeftDockWidgetArea,dock);setCentralWidget(editor);
http://www.jsqmd.com/news/1169707/

相关文章:

  • Unity XR交互层级管理与多模式控制:从原理到实战优化
  • 成都欧米茄回收价格查询和各大平台实测排行(2026年7月最新) - 天价名表回收平台
  • Python 与 Java/C++ 参数传递对比:从3种语言视角看‘对象引用’本质
  • PS 图片拼贴自动化脚本 v26.1|批量智能排版,一键搞定作品集预览图
  • Spring RestTemplate 文件上传下载:大文件流式处理与3种异常排查
  • 数字信号处理 LTI 系统:3 种典型系统因果性与稳定性判定实战 (附 Python 验证)
  • VSLAM 回环检测 3 大算法对比:词袋、随机蕨与 CALC 的实测性能分析
  • 飞行实时仿真系统 VxWorks 实时性保障:帧周期 10ms 内多 CPU 并行调度实战
  • yaml-cpp 0.9.0 发布:C++ 编写的 YAML 解析器,支持跨平台构建与多版本 API
  • AD74412R与STM32F031C6的高性能信号处理系统设计
  • 基于Springboot3+Security6+Jwt实现登录/登出功能
  • 亲身到店探访杭州亨得利官方名表服务中心|最新电话和官方售后热线(2026年7月更新) - 亨得利官方
  • LeetCode--37. 解数独(回溯算法)
  • STM32G431RB与TLA2518 ADC的高精度信号采集方案
  • Python shade-python-sdk 包详解:功能、安装、语法与实战案例
  • PID控制算法C语言实现:3种结构体封装对比与性能实测(附完整代码)
  • 编程助手真实体验测评:6大模型在开发工作流中的手感对比
  • NBM5100A纽扣电池增强方案与PIC18F86J11集成设计
  • 2026 年上半年中国前沿科技赛道融资爆发,量子与核聚变成资本宠儿!
  • AI时代下如何防DDoS? 2026年DDoS攻击趋势报告深度解读
  • 如何让老款Mac重获新生:OpenCore Legacy Patcher终极使用指南
  • 西门子HMI精智面板安全实践:2种自动登录方案的风险对比与权限管理
  • 别再只当聊天软件了!2026,全面爆发的AIAgent正在悄悄砸掉谁的饭碗?
  • 告别龟速下载!9大网盘直链解析神器LinkSwift深度体验指南
  • 郯城城东宴席门店测评 升学寿宴大包间定制服务优选 - 资讯快报
  • Unity集成AndroidX完整指南:解决依赖冲突与AAR模块开发
  • 上海小众宴席宝藏店测评!吴记小菜无预制菜家常烟火气出圈 - 资讯快报
  • 从NCM到MP3:3步解锁你的网易云音乐收藏
  • 静态时序分析(STA)时序弧建模:3类单调性(正/负/非)的数学推导与电路实例
  • CCNA 200-301 备考:从34道真题解析3大核心协议与2类配置陷阱