Qt怎么模仿Visual Studio停靠窗口效果
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"Qt怎么模仿Visual Studio停靠窗口效果",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Qt怎么模仿Visual Studio停
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
杭州币猫网络技术官网
怎么查看主机的数据库密码
东南网络安全毕业待遇
数据库服务器使用手册
网络安全小知识学习心得
军品服务器
互联网对科技影响英语作文
服务器企业管理系统
怎样对软件开发全过程检测
二手服务器选购
oracle数据库编目
teledb 数据库
做app什么软件开发
arsgis如何新建数据库
心电图编码数据库
河北至卓网络技术服务有限公司
服务器144
怎么修改数据库表内容的时间
txt文件乱码转化为数据库
深圳市左右互联网科技有限公司
数据库最重要的软件用户
拓维有限公司网络安全加固方案
2012r2服务器管理
联盟被服务器拒绝登陆
服务器显示屏无信号怎么处理
北京盛德居网络技术有限公司
网络技术有啥岗位呢
安卓时间服务器同步
东莞市视爵网络技术有限公司
1-7无法连接服务器