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標志,則不可以拖到父窗口外。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM