Qt怎么模仿Visual Studio停靠窗口效果
发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,本篇内容主要讲解"Qt怎么模仿Visual Studio停靠窗口效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt怎么模仿Visual Studio停
千家信息网最后更新 2025年02月24日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安全错误
数据库的锁怎样保障安全
如何看待网络安全法的出台
告警数据库
四个域名服务器的名称
路由器是否能连接服务器
湖南自考自助服务器系统
网络技术应用层综合实验报告
专注工业通信网络技术
服务器网卡老是自动断开
数据库视图存储的是
软件开发 五行
服务器带宽跟宽带带宽的区别
倩女幽魂挣钱软件开发
齐鲁工业大学网络安全学校地址
战地4中国服务器
网络安全二年级手抄报图片
补考数据库应用技术卷子
广东外语外贸大学图书馆数据库
网络安全知多少手抄报涂色
人脸识别如何保存到数据库
pc微信数据库解密软件下载
数据库中的表单主键是谁
上海用九网络技术有限公司
hp服务器做raid5
赤子城网络技术有限公司首页
有前后端没有数据库
深圳影像软件开发
网络安全专业学的什么
南非云服务器
广东通用软件开发报价表
软件开发师岗位职责