QT自定义标题栏的可拖拽窗口

由于项目的实际需要,窗口不能使用默认样式,需要实现无边框和qstylesheet加载样式文件,移除标题栏后窗口无法拖动,所有需要在widget的基础上重载mouse的press、move、release三个事件,但由于qwidget不能直接加载style样式,所以在qframe的基础进行重载。

1. 构建FrameTitleBar支持拖动类

复制代码
 1 #include "frametitlebar.h"
 2 
 3 FrameTitleBar::FrameTitleBar(QWidget *parent) :
 4     QFrame(parent),
 5     m_isPressed(false)
 6 {
 7 }
 8 
 9 void FrameTitleBar::mousePressEvent(QMouseEvent* event)
10 {
11     m_isPressed = true;
12     m_startMovePos = event->globalPos();
13 
14     return QFrame::mousePressEvent(event);
15 }
16 
17 void FrameTitleBar::mouseMoveEvent(QMouseEvent* event)
18 {
19     if (m_isPressed)
20     {
21         QPoint movePoint = event->globalPos() - m_startMovePos;
22 
23         if(parentWidget())
24         {
25             QPoint widgetPos = this->parentWidget()->pos();
26             m_startMovePos = event->globalPos();
27             parentWidget()->move(widgetPos.x() + movePoint.x(), widgetPos.y() + movePoint.y());
28         }
29     }
30 
31     return QFrame::mouseMoveEvent(event);
32 }
33 
34 void FrameTitleBar::mouseReleaseEvent(QMouseEvent* event)
35 {
36     m_isPressed = false;
37 
38     return QFrame::mouseReleaseEvent(event);
39 }
复制代码
复制代码
 1 #ifndef FRAMETITLEBAR_H
 2 #define FRAMETITLEBAR_H
 3 
 4 #include <QFrame>
 5 #include <QMouseEvent>
 6 
 7 class FrameTitleBar : public QFrame
 8 {
 9 public:
10     FrameTitleBar(QWidget *parent = 0);
11 
12 protected:
13     virtual void mousePressEvent(QMouseEvent* event);
14     virtual void mouseMoveEvent(QMouseEvent* event);
15     virtual void mouseReleaseEvent(QMouseEvent* event);
16 
17 private:
18     bool            m_isPressed;
19     QPoint          m_startMovePos;
20 };
21 
22 #endif // FRAMETITLEBAR_H
复制代码

2. 在需要添加的无边框窗口上,拖拽出一个frame控件,设置好位置,然后提升为FrameTitleBar类,添加自己的相关按钮(现在使用的qss进行风格样式的设置)

3. 设置父窗口的无边框样式setWindowFlags(Qt::Window | Qt::FramelessWindowHint); 如果没有Qt::Window标志,则不可以拖到父窗口外。


posted on   jobgeo  阅读(5520)  评论(1编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示