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...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
