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...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...