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标志,则不可以拖到父窗口外。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)