Qt中實現無邊框可拖動的窗體


Qt中實現無邊框的窗體

1 自定義窗體類繼承自QWidget

 

2 在構造函數中設置無邊框效果

setWindowFlags(Qt::FramelessWindowHint);//無邊框 
setAttribute(Qt::WA_TranslucentBackground);//背景透明

 

3 實現鼠標拖動窗口

     無邊框窗口沒有了標題欄,無法通過鼠標來移動窗口。可行的方法是重寫窗口的鼠標按下,移動和釋放等事件。

     為了模擬類似拖動標題欄來移動窗口,可以規定當鼠標單擊在某個特定的區域(例如頂部高度為100的矩形區域)才能移動窗口。

    下面是一個無邊框背景透明的窗體類的代碼:

復制代碼
//頭文件:BaseWidget.h #ifndef BASEWIDGET_H #define BASEWIDGET_H #include <QWidget> #include <QMouseEvent> //繼承自QWidget的自定義窗口,單擊(左右鍵皆可)窗口並移動鼠標可拖動窗口 class BaseWidget : public QWidget { Q_OBJECT public: explicit BaseWidget(QWidget *parent = 0); //設置鼠標按下可移動窗口的區域,在子窗口中必須設置該區域 void setAreaMovable(const QRect rt); protected: void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); private: QRect m_areaMovable;//可移動窗口的區域,鼠標只有在該區域按下才能移動窗口 bool m_bPressed;//鼠標按下標志(不分左右鍵) QPoint m_ptPress;//鼠標按下的初始位置 }; #endif // BASEWIDGET_H
復制代碼

 

復制代碼
源文件:BaseWidget.cpp
#include "basewidget.h" #include <QDebug> BaseWidget::BaseWidget(QWidget *parent) : QWidget(parent) { //設置無邊框透明 setWindowFlags(Qt::FramelessWindowHint);//無邊框 setAttribute(Qt::WA_TranslucentBackground);//背景透明  m_areaMovable = geometry(); m_bPressed = false; } void BaseWidget::mousePressEvent(QMouseEvent *e) { //鼠標左鍵 if(e->button() == Qt::LeftButton) { m_ptPress = e->pos(); qDebug() << pos() << e->pos() << m_ptPress; m_bPressed = m_areaMovable.contains(m_ptPress); } } void BaseWidget::mouseMoveEvent(QMouseEvent *e) { if(m_bPressed) { qDebug() << pos() << e->pos() << m_ptPress; move(pos() + e->pos() - m_ptPress); } } void BaseWidget::mouseReleaseEvent(QMouseEvent *) { m_bPressed = false; } //設置鼠標按下的區域 void BaseWidget::setAreaMovable(const QRect rt) { if(m_areaMovable != rt) { m_areaMovable = rt; } }
復制代碼


免責聲明!

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



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