1. 程式人生 > 程式設計 >Qt無邊框視窗拖拽和陰影的實現方法

Qt無邊框視窗拖拽和陰影的實現方法

無邊框視窗的實現

只需要一行程式碼即可實現

this->setWindowFlags(Qt::FramelessWindowHint);

Qt無邊框視窗拖拽和陰影的實現方法

程式碼及執行效果:

Qt無邊框視窗拖拽和陰影的實現方法

無邊框視窗能拖拽實現

先要去QWidget裡面找到 滑鼠事件 函式

Qt無邊框視窗拖拽和陰影的實現方法

理一下 座標的位置 情況:

左上角:螢幕的左上角

中間的視窗:程式的視窗

箭頭:滑鼠位置

座標位置滿足: x = y - z

Qt無邊框視窗拖拽和陰影的實現方法

在Designer裡面拖一個Widget出來叫shadowWidget

Qt無邊框視窗拖拽和陰影的實現方法

shadowWidget的顏色為灰色,我們選個自己喜歡的背景色方便檢視

Qt無邊框視窗拖拽和陰影的實現方法

接下來我們要重寫滑鼠事件函式才能讓拖拽功能生效

void Widget::mouseMoveEvent(QMouseEvent *event)
{
 QPoint y = event->globalPos();//滑鼠相當於桌面左上角的位置,滑鼠全域性位置
 QPoint x = y - this->z;
 this->move(x);
}
​
void Widget::mousePressEvent(QMouseEvent *event)
{
 QPoint y = event->globalPos();//滑鼠相當於桌面左上角的位置,滑鼠全域性位置
 QPoint x = this->geometry().topLeft();//視窗左上角位於桌面左上角的位置,視窗位置
 this->z = y - x; //定值,不變
}
​
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
 this->z = QPoint(); //滑鼠鬆開獲取當前的座標
}

最終效果變為滑鼠可拖動的視窗:

Qt無邊框視窗拖拽和陰影的實現方法

原始碼:

main.cpp

 #include "widget.h"
 #include <QApplication>
 ​
 int main(int argc,char *argv[])
 {
 QApplication a(argc,argv);
 Widget w;
 w.show();
 ​
 return a.exec();
 }

widget.cpp

 #include "widget.h"
 #include "ui_widget.h"
 #include <QMouseEvent>
 #include <QWidget>
 #include <QGraphicsDropShadowEffect>
 ​
 Widget::Widget(QWidget *parent) :
 QWidget(parent),ui(new Ui::Widget)
 {
 ui->setupUi(this);
 ​
 this->setWindowFlags(Qt::FramelessWindowHint);
 ​
 QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect();
 ​
 shadow->setBlurRadius(5); //邊框圓角
 shadow->setColor(Qt::black);//邊框顏色
 shadow->setOffset(0);  //不偏移
 ​
 ui->shadowWidget->setGraphicsEffect(shadow);
 ​
 this->setAttribute(Qt::WA_TranslucentBackground); //父視窗設定透明,只留下子視窗
 }
 ​
 Widget::~Widget()
 {
 delete ui;
 }
 ​
 void Widget::mouseMoveEvent(QMouseEvent *event)
 {
 QPoint y = event->globalPos();//滑鼠相當於桌面左上角的位置,滑鼠全域性位置
 QPoint x = y - this->z;
 this->move(x);
 }
 ​
 void Widget::mousePressEvent(QMouseEvent *event)
 {
 QPoint y = event->globalPos();//滑鼠相當於桌面左上角的位置,滑鼠全域性位置
 QPoint x = this->geometry().topLeft();//視窗左上角位於桌面左上角的位置,視窗位置
 this->z = y - x; //定值,不變
 }
 ​
 void Widget::mouseReleaseEvent(QMouseEvent *event)
 {
 this->z = QPoint(); //滑鼠鬆開獲取當前的座標
 }

widget.h

 #ifndef WIDGET_H
 #define WIDGET_H
 ​
 #include <QWidget>
 ​
 namespace Ui {
 class Widget;
 }
 ​
 class Widget : public QWidget
 {
 Q_OBJECT
 ​
 public:
 explicit Widget(QWidget *parent = 0);
 ~Widget();
 ​
 virtual void mouseMoveEvent(QMouseEvent *event);
 virtual void mousePressEvent(QMouseEvent *event);
 virtual void mouseReleaseEvent(QMouseEvent *event);
 ​
 private:
 Ui::Widget *ui;
 QPoint z;
 };
 ​
 #endif // WIDGET_H

總結

到此這篇關於Qt無邊框視窗拖拽和陰影的實現方法的文章就介紹到這了,更多相關Qt無邊框視窗拖拽和陰影內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!