Qt無邊框視窗拖拽和陰影的實現方法
阿新 • • 發佈:2020-11-05
無邊框視窗的實現
只需要一行程式碼即可實現
this->setWindowFlags(Qt::FramelessWindowHint);
程式碼及執行效果:
無邊框視窗能拖拽實現
先要去QWidget裡面找到 滑鼠事件 函式
理一下 座標的位置 情況:
左上角:螢幕的左上角
中間的視窗:程式的視窗
箭頭:滑鼠位置
座標位置滿足: x = y - z
在Designer裡面拖一個Widget出來叫shadowWidget
shadowWidget的顏色為灰色,我們選個自己喜歡的背景色方便檢視
接下來我們要重寫滑鼠事件函式才能讓拖拽功能生效
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(); //滑鼠鬆開獲取當前的座標 }
最終效果變為滑鼠可拖動的視窗:
原始碼:
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無邊框視窗拖拽和陰影內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!