众所周知,停靠窗口可以实现任意拖动效果,本文重点在于如何利用qt制作与visual studio相似的带有停靠方向标及停靠区域预览的的停靠窗口框架。
1、鼠标在中间方向标:叠加窗口
2、鼠标在上下左右方向标:分割目标窗口,并紧挨着目标窗口周边位置添加新窗口
3、鼠标在内部最上下左右方向标:目标窗口所在的最上下左右位置添加新窗口
4、鼠标在外部最上下左右方向标:程序主窗口的最上下左右位置添加新窗口
5、鼠标在tab位置上:在当前所在tab页位置插入新窗口
6、鼠标在tab最右侧位置上:在tab页尾部添加新窗口
注释:dock停靠优先级:某些情况下,外部最上下左右方向的方向标会和目标窗口方向标重叠,此时遵循 中间停靠优于外部停靠、方向标停靠优于tab页停靠
的原则。
#pragma once#include <qwidget>#include <qpaintevent>#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 tmainwindow(qmainwindow *mainwindow);// 创建停靠窗口qwhdockwidget *createdockwidget(qwhdockwidget::areamode areamode, const qstring &windowtitle = "");// 创建分裂器(水平分裂)qsplitter *createsplitter();// 创建分裂器(由参数orientation决定分裂方向)qsplitter *createsplitter(qt::orientation orientation);// 设置程序主分裂器void tmainsplitter(qsplitter *splitter);// 设置目标窗口(接收方)void ttargetwidget(qtabwidget *widget);// 设置当前页索引(鼠标移入当前页 或 鼠标移入中心方向标)void tcurtabindex(int index);// 设置鼠标按下的停靠窗口(准备移动的窗口)void tmoupresd(qwhdockwidget *movedockwidget);// 设置鼠标释放void tmourelead();// 获取停靠窗口推荐最小尺寸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;qsplitt电视剧解密er *m_mainsplitter;qwhdockwidget *m_movedockwidget;qtabwidget *m_targetwidget;qlist<qwhdockwidget *> 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_rig动力源泉htmostrect, 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.tupui(this);qwhtabwidgetmask::getinstance()->tmainwindow(this);// 测试左侧停靠窗体qwhdockwidget *dockwidget = qwhtabwidgetmask::getinstance()->createdockwidget(qwhdockwidget::mode_minor, "总tab");qsplitter *splitter = qwhtabwidgetmask::getinstance()->createsplitter();splitter->addwidget(dockwidget);dockwidget->tfloating(fal);qwidget *widget1 = new qwidget();widget1->tminimumsize(200, 100);widget1->tstylesheet("background-color: green;");dockwidget->tabwidget()->addtab(widget1, "第一页");qwidget *widget2 = new qwidget();widget2->tminimumsize(200, 100);widget2->tstylesheet("background-color: green;");dockwidget->tabwidget()->addtab(widget2, "第二页");qwidget *widget3 = new qwidget();widget3->tminimumsize(200, 100);widget3->tstylesheet("background-color: green;");dockwidget->tabwidget()->addtab(widget3, "第三页");// 测试中间停靠窗体qwhdockwidget *dockwidgetcenter fireworks8= qwhtabwidgetmask::getinstance()->createdockwidget(qw朝慕思hdockwidget::mode_main, "总tabcenter");splitter->addwidget(dockwidgetcenter);dockwidgetcenter->tfloating(fal);qwidget *widgetcenter1 = new qwidget();widgetcenter1->tminimumsize(200, 100);widgetcenter1->tstylesheet("background-color: rgb(255, 174, 201);");dockwidgetcenter->tabwidget()->addtab(widgetcenter1, "第一页center");qwidget *widgetcenter2 = new qwidget();widgetcenter2->tminimumsize(200, 100);widgetcenter2->tstylesheet("background-color: rgb(255, 174, 201);");dockwidgetcenter->tabwidget()->addtab(widgetcenter2, "第二页center");qwidget *widgetcenter3 = new qwidget();widgetcenter3->tminimumsize(200, 100);widgetcenter3->tstylesheet("background-color: rgb(255, 174, 201);");dockwidgetcenter->tabwidget()->addtab(widgetcenter3, "第三页center");// 测试右侧停靠窗体qwhdockwidget *dockwidget2 = qwhtabwidgetmask::getinstance()->createdockwidget(qwhdockwidget::mode_minor, "总tab2");splitter->addwidget(dockwidget2);dockwidget2->tfloating(fal);qwidget *widget12 = new qwidget();widget12->tminimumsize(200, 100);widget12->tstylesheet("background-color: gray;");dockwidget2->tabwidget()->addtab(widget12, "第一页2");qwidget *widget22 = new qwidget();widget22->tminimumsize(200, 100);widget22->tstylesheet("background-color: gray;");dockwidget2->tabwidget()->addtab(widget22, "第二页2");qwidget *widget32 = new qwidget();widget32->tminimumsize(200, 100);widget32->tstylesheet("background-color: gray;");dockwidget2->tabwidget()->addtab(widget32, "第三页2");qwhtabwidgetmask::getinstance()->tmainsplitter(splitter);}
到此这篇关于qt模仿visual studio停靠窗口效果的文章就介绍到这了,更多相关qt停靠窗口 内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 14:26:45,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1a6c33dfac79b2efed94a8ae51d230ae.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Qt模仿Visual Studio停靠窗口效果.doc
本文 PDF 下载地址:Qt模仿Visual Studio停靠窗口效果.pdf
留言与评论(共有 0 条评论) |