Qt QDockWidget详解以及例程
Qt QDockWidget详解以及例程
- 引言
- 一、基本用法
- 二、深入了解
- 2.1 窗口功能相关
- 2.2 停靠区域限制
- 2.3 在主窗体布局
引言

QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列),也可以作为QMainWindow上的顶级窗口浮动 (类似一个独立的窗口,可以通过拖动操作将QDockWidget浮动到任何位置),也可以选择限制DockWidget移动、浮动和关闭的能力,以及它们可以放置的区域。
一、基本用法
- 在QMainWindow中将
QDockWidget绘制成均匀排列 (如上图所示),源码如下:
ui->setupUi(this);QWidget *w = takeCentralWidget();delete w;// 创建QWidget *wid_a = new QWidget(this);wid_a->setStyleSheet("border: 2px solid #000000;");QDockWidget* dock_a = new QDockWidget(this);dock_a->setFeatures(QDockWidget::AllDockWidgetFeatures);dock_a->setWindowTitle("a");dock_a->setWidget(wid_a);QWidget *wid_b = new QWidget(this);wid_b->setStyleSheet("border: 2px solid #000000;");QDockWidget* dock_b = new QDockWidget(this);dock_b->setFeatures(QDockWidget::AllDockWidgetFeatures);dock_b->setWindowTitle("b");dock_b->setWidget(wid_b);QWidget *wid_c = new QWidget(this);wid_c->setStyleSheet("border: 2px solid #000000;");QDockWidget* dock_c = new QDockWidget(this);dock_c->setFeatures(QDockWidget::AllDockWidgetFeatures);dock_c->setWindowTitle("c");dock_c->setWidget(wid_c);QWidget *wid_d = new QWidget(this);wid_d->setStyleSheet("border: 2px solid #000000;");QDockWidget* dock_d = new QDockWidget(this);dock_d->setFeatures(QDockWidget::AllDockWidgetFeatures);dock_d->setWindowTitle("d");dock_d->setWidget(wid_d);// 布局addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, dock_a);splitDockWidget(dock_a, dock_b, Qt::Orientation::Horizontal);splitDockWidget(dock_a, dock_c, Qt::Orientation::Vertical);splitDockWidget(dock_b, dock_d, Qt::Orientation::Vertical);
其他示例可参考:
- QDockWidget 用法示例代码QMainwindow:https://blog.csdn.net/lanmanck/article/details/122466337
- Qt之QDockWidget窗口详解—含演示Demo:https://blog.csdn.net/ManagerUser/article/details/124892827
- Qt QDockWidget嵌套布局详解-实现Visual Studio布局:https://www.cnblogs.com/ybqjymy/p/14577183.html
二、深入了解
只列举了相关常用函数,更多细节可参考官方文档。
2.1 窗口功能相关
-
void setFeatures(QDockWidget::DockWidgetFeatures features)
设置
QDockWidget的功能,是否可移动、可关闭和可浮动 (默认可以)。可传入的参数如下表所示:
| 常量 | 值 | |
|---|---|---|
| QDockWidget::DockWidgetClosable | 0x01 | 可关闭 |
| QDockWidget::DockWidgetMovable | 0x02 | 可移动 |
| QDockWidget::DockWidgetFloatable | 0x04 | 可浮动 |
| QDockWidget::DockWidgetVerticalTitleBar | 0x08 | 左侧显示垂直标题 |
| QDockWidget::AllDockWidgetFeatures | 0x07 | 可关闭、移动和浮动 (不建议使用) |
| QDockWidget::NoDockWidgetFeatures | 0x00 | 无法关闭、移动和浮动 |
-
QDockWidget::DockWidgetFeatures features() const可获取当前QDockWidget的DockWidgetFeatures ,并且当其DockWidgetFeatures 改变时,会发送featuresChanged信号,详见setFeatures函数部分源码:
void QDockWidget::setFeatures(QDockWidget::DockWidgetFeatures features)
{Q_D(QDockWidget);features &= DockWidgetFeatureMask;if (d->features == features)return;const bool closableChanged = (d->features ^ features) & DockWidgetClosable;d->features = features;QDockWidgetLayout *layout= qobject_cast<QDockWidgetLayout*>(this->layout());layout->setVerticalTitleBar(features & DockWidgetVerticalTitleBar);d->updateButtons();d->toggleViewAction->setEnabled((d->features & DockWidgetClosable) == DockWidgetClosable);emit featuresChanged(d->features); // 发送信号... 以下省略
2.2 停靠区域限制
-
void setAllowedAreas(Qt::DockWidgetAreas areas)
设置可以放置QDockWidget的区域,默认为Qt::AllDockWidgetAreas.可传入的参数如下表所示:
| 常量 | 值 | |
|---|---|---|
| Qt::LeftDockWidgetArea | 0x1 | 可停靠左侧 |
| Qt::RightDockWidgetArea | 0x2 | 可停靠右侧 |
| Qt::TopDockWidgetArea | 0x4 | 可停靠上侧 |
| Qt::BottomDockWidgetArea | 0x8 | 可停靠下侧 |
| Qt::AllDockWidgetAreas | DockWidgetArea_Mask (0xf) | 哪都能停 |
| Qt::NoDockWidgetArea | 0 | 停靠不了一点 |
-
Qt::DockWidgetAreas allowedAreas() const可获取当前QDockWidget的DockWidgetAreas,并且当其DockWidgetAreas改变时,会发送allowedAreasChanged信号。
2.3 在主窗体布局
这个用的比较多
-
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
重载函数void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation),可修改方向,垂直 or 水平。
将
QDockWidget添加到指定区域 - 上下左右,其中参数是TopDockWidgetArea默认水平排列 (如下图所示),如果是LeftDockWidgetArea默认垂直排列。

addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_a);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_b);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_c);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_d);
-
void QMainWindow::splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation)
将第一个QDockWidget 覆盖的空间分成两部分,分别放入两个QDockWidget (方向指定了QDockWidget的空间排列方式:设置为水平则第二个QDockWidget放置在第一个的右边;设置为垂直则将第二个dock小部件放在第一个下面)
-
void QMainWindow::tabifyDockWidget(QDockWidget *first, QDockWidget *second)
合并窗口:将第二个QDockWidget嵌套合并到到第一个QDockWidget的位置,位置下方有标签可以切换显示的窗口。

addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_a);
tabifyDockWidget(dock_a, dock_b);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_c);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_d);
-
void QMainWindow::setCorner(Qt::Corner corner, Qt::DockWidgetArea area)
指定某个DockWidgetArea的QDockWidget设置为占据给定的角 (
就四个角,不展开描述了)。示例如下:

不加setCorner,后来加的两个(Top)窗口就把a b俩(left)窗口挤下去了,如果设置左侧停靠区域的窗口占据左上角,那么a b就到左上角,c d往右排. (实际使用,特别是存在大量窗口时用的比较少),具体布局代码如下所示:
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, dock_a);
addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, dock_b);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_c);
addDockWidget(Qt::DockWidgetArea::TopDockWidgetArea, dock_d);setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); // 加不加这行...
-
void setDockNestingEnabled(bool enabled)
如果是
false,则停靠区域只能包含一行(水平或垂直)QDockWidget,限制较大。如果是True则可随意摆放,自由度更高,但是操作会略复杂,将QDockWidget移动到另一个QDockWidget上可能会嵌套合并或者垂直 or 水平排列,需要更细致的操作…
相关文章:
Qt QDockWidget详解以及例程
Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列),也可以作为QMainWindow上的顶级窗口浮动 (类似一…...
机器学习之贝叶斯分类器和混淆矩阵可视化
贝叶斯分类器 目录 贝叶斯分类器1 贝叶斯分类器1.1 概念1.2算法理解1.3 算法导入1.4 函数 2 混淆矩阵可视化2.1 概念2.2 理解2.3 函数导入2.4 函数及参数2.5 绘制函数 3 实际预测3.1 数据及理解3.2 代码测试 1 贝叶斯分类器 1.1 概念 贝叶斯分类器是基于贝叶斯定理构建的分类…...
关于大数据的基础知识(一)——定义特征结构要素
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于大数据的基础知识(一&a…...
2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅
在科技的浪潮中,AI 技术与开源探索的火花不断碰撞,催生出无限可能。2025 年 1 月 4 日,由 GitCode 联合 CSDN COC 城市开发者社区精心打造的开年首场开发者活动:冬日嘉年华在北京中关村 • 鼎好 DH3-A 座 22 层盛大举行࿰…...
【MyBatis-Plus 进阶功能】开发中常用场景剖析
MyBatis-Plus(MP)除了封装常见的 CRUD 操作,还提供了一些高级功能,进一步简化复杂场景下的开发工作。本文将逐一讲解 逻辑删除、自动填充、多表关联查询的原理与使用方式,让你快速掌握这些技巧! 一、逻辑删…...
【C++/控制台】2048小游戏
源代码: #include <iostream> #include <windows.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h>// #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)…...
Linux 中 top 命令的使用与实例解读
目录 Linux 中 top 命令的使用与实例解读一、top 命令参数二、输出字段含义(一)系统信息(二)任务信息(三)CPU 信息(四)内存信息 三、实例解读系统信息任务信息CPU信息内存信息进程列…...
C++ STL 中的 `unordered_map` 和 `unordered_set` 总结
1. unordered_map unordered_map 是一个基于哈希表实现的容器,存储键值对(key-value),每个键必须唯一,可以快速插入、删除、查找。 基本特性 存储结构:键值对 (key-value)。键唯一性:每个键在…...
机器学习基础-概率图模型
(一阶)马尔科夫模型的基本概念 状态、状态转换概率、初始概率 状态转移矩阵的基本概念 隐马尔可夫模型(HMM)的基本概念 条件随机场(CRF)的基本概念 实际应用中的马尔科夫性 自然语言处理: 在词性…...
【MySQL】九、表的内外连接
文章目录 前言Ⅰ. 内连接案例:显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来 2、右外连接案例:对stu表和exam表联合查询,把…...
芯片详细讲解,从而区分CPU、MPU、DSP、GPU、FPGA、MCU、SOC、ECU
目录 芯片的概念结构 芯片的派系划分 通用芯片(CPU,MPU,GPU,DSP) 定制芯片(FPGA,ASIC) 芯片之上的集成(MCU,SOC,ECU) 软硬件的匹…...
halcon三维点云数据处理(十)locate_cylinder_3d
目录 一、locate_cylinder_3d例程代码二、gen_binocular_rectification_map函数三、binocular_disparity函数四、自定义函数select_best_candidates五、自定义函数remove_shadowed_regions 一、locate_cylinder_3d例程代码 1、读取或者创建3D形状模型, 2、根据双目…...
vue(2,3), react (16及以上)开发者工具资源
在前端开发的广阔领域中,Vue.js 和 React.js 作为两大主流框架,各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发,Vue Devtools 和 React 开发者工具应运而生,成为这两个框架不可或缺的辅助工具。本…...
2025年华为OD上机考试真题(Java)——整数对最小和
题目: 给定两个整数数组array1、array2,数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值。 注意:两对元素如果对应…...
进程间通信——网络通信——UDP
进程间通信(分类):网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型:(理论模型) 应用层 : 要传输的数据信息,如文件传输,电子邮件等 表示层 : 数…...
【我的 PWN 学习手札】IO_FILE 之 FSOP
FSOP:File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus,进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP (…...
新兴的开源 AI Agent 智能体全景技术栈
新兴的开源 AI Agent 智能体全景技术栈 LLMs:开源大模型嵌入模型:开源嵌入模型模型的访问和部署:Ollama数据存储和检索:PostgreSQL, pgvector 和 pgai后端:FastAPI前端:NextJS缺失的一环:评估和…...
统计学习方法(第二版) 概率分布学习
本文主要介绍机器学习的概率分布,帮助后续的理解。 定义直接从书上搬的想自己写,但没有定义准确,还浪费事件,作为个人笔记,遇到速查。 目录 一、二点分布(0-1分布、伯努利分布) 二、二项分布…...
淺談Cocos2djs逆向
前言 簡單聊一下cocos2djs手遊的逆向,有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念: Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio,區別是前者是cocos2djs專用的開發工具,後者則是coco…...
【ROS2】RViz2加载URDF模型文件
1、RViz2加载URDF模型文件 1)运行RViz2 rviz22)添加组件:RobotModel 3)选择通过文件添加 4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可 5)因为没有坐标转换,依然会报错,下面尝试解决 2、运行坐标转换节点 1)运行ROS节点:robot_state_publishe...
SEO_掌握这5个SEO技巧,让流量持续增长
SEO技巧:让你的网站流量持续增长的5个关键策略 在当今数字化时代,网站流量的稳定增长对于企业的成功至关重要。搜索引擎优化(SEO)是提高网站流量的核心手段之一。掌握一些关键的SEO技巧,不仅可以帮助你在搜索结果中获…...
代码写不动了?传统程序员不转型AI工程化提示词专家,将被AI助手彻底平替
2026年开年,全球科技圈的裁员潮撕开了行业变革的残酷真相:甲骨文一天内裁掉3万名员工,其中绝大多数是从事基础编码、数据库维护的传统程序员。取代他们的,正是曾经被视为“辅助工具”的AI助手。值得关注的是,在这场行业…...
ESP32 PSRAM容器库:STL容器外扩至外部伪静态RAM
1. PSRAM Containers 项目概述PSRAM Containers 是一个面向 ESP32 平台的嵌入式 C 内存容器库,其核心目标是将标准 STL 容器(如std::vector、std::deque、std::list、std::map等)的功能完整迁移至外部伪静态 RAM(Pseudo-Static RA…...
OpenClaw v2026.4.2 深度解读:插件边界继续外移,Task Flow 真正走向可持久化运维
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
从引脚定义到PCB布线:硬件工程师的SATA接口设计避坑指南(附信号完整性实测)
从引脚定义到PCB布线:硬件工程师的SATA接口设计避坑指南(附信号完整性实测) 在当今数据驱动的硬件设计中,SATA接口依然是存储设备连接的中坚力量。作为一名经历过无数次深夜调试的硬件工程师,我深知一个看似简单的SATA…...
新手零门槛入门:在快马平台轻松学会为openclaw切换不同的ai模型
今天想和大家分享一个特别适合AI编程新手的实践项目——在InsCode(快马)平台上为openclaw切换不同的AI模型。作为一个刚接触AI辅助开发的小白,我最初看到"更换模型"这种操作时总觉得很复杂,但实际体验后发现这个平台把整个过程简化得像搭积木一…...
OpenClaw任务监控实战:Phi-3-vision-128k-instruct长流程管理
OpenClaw任务监控实战:Phi-3-vision-128k-instruct长流程管理 1. 为什么需要长流程监控 去年夏天,我接手了一个需要处理大量图文混合数据的项目。最初尝试用传统脚本串联处理,结果发现当任务运行到第37小时突然中断时,我甚至不知…...
从零开始:5个必知的图像篡改检测数据集下载与使用指南(附避坑提醒)
从零开始:5个必知的图像篡改检测数据集下载与使用指南(附避坑提醒) 当你第一次接触图像篡改检测领域时,最令人头疼的往往不是算法本身,而是如何找到合适的数据集。我曾见过不少研究生花费数周时间在各大论坛和GitHub仓…...
HTTP3 QUIC快速重传机制解析:如何优化网络传输效率
1. HTTP3 QUIC快速重传机制的核心价值 你有没有遇到过视频卡顿、网页加载慢的问题?这背后往往是因为网络丢包导致的传输效率下降。HTTP3 QUIC协议的快速重传机制就是为了解决这个问题而生的。相比传统的TCP协议,QUIC在应对网络丢包时表现更加出色&#x…...
如何通过培养持久专注力技巧来应对多动症干预?
持久专注力技巧助力多动症有效干预应对 培养持久专注力是有效应对多动症的重要策略之一。首先,保持一个规律的学习环境能显著提高孩子的专注力。家长可以为孩子提供一个安静且无干扰的学习空间,定期设定学习时间。此外,采用分段学习法&#x…...
