Qt怎么模仿Visual Studio停靠窗口效果
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,本篇内容主要讲解"Qt怎么模仿Visual Studio停靠窗口效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt怎么模仿Visual Studio停
千家信息网最后更新 2025年11月09日Qt怎么模仿Visual Studio停靠窗口效果
本篇内容主要讲解"Qt怎么模仿Visual Studio停靠窗口效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt怎么模仿Visual Studio停靠窗口效果"吧!
效果图
功能
1、鼠标在中间方向标:叠加窗口
2、鼠标在上下左右方向标:分割目标窗口,并紧挨着目标窗口周边位置添加新窗口
3、鼠标在内部最上下左右方向标:目标窗口所在的最上下左右位置添加新窗口
4、鼠标在外部最上下左右方向标:程序主窗口的最上下左右位置添加新窗口
5、鼠标在Tab位置上:在当前所在tab页位置插入新窗口
6、鼠标在Tab最右侧位置上:在tab页尾部添加新窗口
注释:Dock停靠优先级:某些情况下,外部最上下左右方向的方向标会和目标窗口方向标重叠,此时遵循 中间停靠优于外部停靠、方向标停靠优于tab页停靠的原则。
部分头文件
#pragma once#include#include #include "QWHDockWidget.h"class QMainWindow;class QTabWidget;class QDockWidget;class QSplitter;class QWHTabWidgetMask : public QWidget{ Q_OBJECTpublic: enum Area { None,Top, Right, Bottom, Left, TopMore, RightMore, BottomMore, LeftMore, Center, TopMost, RightMost, BottomMost, LeftMost }; QWHTabWidgetMask(); ~QWHTabWidgetMask(); static QWHTabWidgetMask *getInstance(); // 设置程序主窗口 void setMainWindow(QMainWindow *mainWindow); // 创建停靠窗口 QWHDockWidget *createDockWidget(QWHDockWidget::AreaMode areaMode, const QString &windowTitle = ""); // 创建分裂器(水平分裂) QSplitter *createSplitter(); // 创建分裂器(由参数orientation决定分裂方向) QSplitter *createSplitter(Qt::Orientation orientation); // 设置程序主分裂器 void setMainSplitter(QSplitter *splitter); // 设置目标窗口(接收方) void setTargetWidget(QTabWidget *widget); // 设置当前页索引(鼠标移入当前页 或 鼠标移入中心方向标) void setCurTabIndex(int index); // 设置鼠标按下的停靠窗口(准备移动的窗口) void setMousePressed(QWHDockWidget *moveDockWidget); // 设置鼠标释放 void setMouseReleased(); // 获取停靠窗口推荐最小尺寸 QSize minimumSizeHint() const override; // 获取鼠标按下的停靠窗口(准备移动或正在移动的窗口) QDockWidget *moveDockWidget(); // 获取程序主分裂器 QSplitter *mainSplitter(); // 获取程序主窗口 QMainWindow *mainWindow();protected: void paintEvent(QPaintEvent *event);private: // 获取指定索引的边界路径 QPainterPath tabWidgetBorderPath(QTabWidget *tabWidget, int tabIndex); // 绘制主停靠窗口的指示器 void drawMainDockIndicator(); // 绘制次停靠窗口的指示器 void drawMinorDockIndicator(); // 检查鼠标所在方向标区域 Area checkArea(QPoint globalPos);signals: // 创建停靠窗口 void dockWidgetAdded(QWHDockWidget *newDockWidget);private: QMainWindow *m_mainWindow; QSplitter *m_mainSplitter; QWHDockWidget *m_moveDockWidget; QTabWidget *m_targetWidget; QList m_listDockWidgets; int m_tabIndex; QColor m_borderColor; QColor m_bgColor; QRect m_centerRect; // 中心矩形 QRect m_topRect, m_rightRect, m_bottomRect, m_leftRect; // 四个方位矩形(紧挨着中心矩形) QRect m_topMoreRect, m_rightMoreRect, m_bottomMoreRect, m_leftMoreRect; // 更加靠边四个方位矩形(紧挨着四个方位矩形) QRect m_topMostRect, m_rightMostRect, m_bottomMostRect, m_leftMostRect; // 最靠边四个方向矩形(紧挨着主窗口四边) QPixmap m_centerPixmap; QPixmap m_topPixmap, m_rightPixmap, m_bottomPixmap, m_leftPixmap; QPixmap m_topMostPixmap, m_rightMostPixmap, m_bottomMostPixmap, m_leftMostPixmap; QPixmap m_centerPixmapHover; QPixmap m_topPixmapHover, m_rightPixmapHover, m_bottomPixmapHover, m_leftPixmapHover; QPixmap m_topMostPixmapHover, m_rightMostPixmapHover, m_bottomMostPixmapHover, m_leftMostPixmapHover;};
测试代码
TestVSWindow::TestVSWindow(QWidget *parent) : QMainWindow(parent){ ui.setupUi(this); QWHTabWidgetMask::getInstance()->setMainWindow(this); // 测试左侧停靠窗体 QWHDockWidget *dockWidget = QWHTabWidgetMask::getInstance()->createDockWidget(QWHDockWidget::Mode_Minor, "总tab"); QSplitter *splitter = QWHTabWidgetMask::getInstance()->createSplitter(); splitter->addWidget(dockWidget); dockWidget->setFloating(false); QWidget *widget1 = new QWidget(); widget1->setMinimumSize(200, 100); widget1->setStyleSheet("background-color: green;"); dockWidget->tabWidget()->addTab(widget1, "第一页"); QWidget *widget2 = new QWidget(); widget2->setMinimumSize(200, 100); widget2->setStyleSheet("background-color: green;"); dockWidget->tabWidget()->addTab(widget2, "第二页"); QWidget *widget3 = new QWidget(); widget3->setMinimumSize(200, 100); widget3->setStyleSheet("background-color: green;"); dockWidget->tabWidget()->addTab(widget3, "第三页"); // 测试中间停靠窗体 QWHDockWidget *dockWidgetCenter = QWHTabWidgetMask::getInstance()->createDockWidget(QWHDockWidget::Mode_Main, "总tabCenter"); splitter->addWidget(dockWidgetCenter); dockWidgetCenter->setFloating(false); QWidget *widgetCenter1 = new QWidget(); widgetCenter1->setMinimumSize(200, 100); widgetCenter1->setStyleSheet("background-color: rgb(255, 174, 201);"); dockWidgetCenter->tabWidget()->addTab(widgetCenter1, "第一页Center"); QWidget *widgetCenter2 = new QWidget(); widgetCenter2->setMinimumSize(200, 100); widgetCenter2->setStyleSheet("background-color: rgb(255, 174, 201);"); dockWidgetCenter->tabWidget()->addTab(widgetCenter2, "第二页Center"); QWidget *widgetCenter3 = new QWidget(); widgetCenter3->setMinimumSize(200, 100); widgetCenter3->setStyleSheet("background-color: rgb(255, 174, 201);"); dockWidgetCenter->tabWidget()->addTab(widgetCenter3, "第三页Center"); // 测试右侧停靠窗体 QWHDockWidget *dockWidget2 = QWHTabWidgetMask::getInstance()->createDockWidget(QWHDockWidget::Mode_Minor, "总tab2"); splitter->addWidget(dockWidget2); dockWidget2->setFloating(false); QWidget *widget12 = new QWidget(); widget12->setMinimumSize(200, 100); widget12->setStyleSheet("background-color: gray;"); dockWidget2->tabWidget()->addTab(widget12, "第一页2"); QWidget *widget22 = new QWidget(); widget22->setMinimumSize(200, 100); widget22->setStyleSheet("background-color: gray;"); dockWidget2->tabWidget()->addTab(widget22, "第二页2"); QWidget *widget32 = new QWidget(); widget32->setMinimumSize(200, 100); widget32->setStyleSheet("background-color: gray;"); dockWidget2->tabWidget()->addTab(widget32, "第三页2"); QWHTabWidgetMask::getInstance()->setMainSplitter(splitter);}到此,相信大家对"Qt怎么模仿Visual Studio停靠窗口效果"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
鼠标
方向
上下
位置
矩形
目标
程序
效果
测试
上下左右
左右方
所在
方位
窗体
向标
移动
内容
右侧
指示
指示器
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器里有多少个硬盘
如何判断数据库表是否有数据
小学信息技术将数据库索引
金蝶软件开发笔试题
成都众信互联网络科技
翡翠鉴定软件开发
德立信软件开发地址
三级网络技术给发草稿纸吗
现代网络技术手段概论论文
大学 网络安全 宣传部
滦州网络技术售后服务
软件开发使用合同范本
手机网络安全面临的严峻形势
盐城软件开发咨询热线
邮寄服务器协议
用友t3需要什么数据库
数据库表存量是什么意思
西安科技大学互联网工程
数据库的使用与管理
陈鑫杰简介 网络安全
服务器监工工具
为啥spss打不开数据库
网络安全法有关视频
discuz服务器配置
软件开发首付款支付10%
华电集团网络安全
数据库能做什么职业
使用下面dns服务器是什么
杭州米达尔网络技术有限公司
消防组织观看网络安全教育视频