Qt無邊框窗口拖拽和陰影的實(shí)現(xiàn)方法
無邊框窗口的實(shí)現(xiàn)
只需要一行代碼即可實(shí)現(xiàn)
this->setWindowFlags(Qt::FramelessWindowHint);
代碼及運(yùn)行效果:
無邊框窗口能拖拽實(shí)現(xiàn)
先要去QWidget里面找到 鼠標(biāo)事件 函數(shù)
理一下 坐標(biāo)的位置 情況:
左上角:屏幕的左上角
中間的窗口:程序的窗口
箭頭:鼠標(biāo)位置
坐標(biāo)位置滿足: x = y - z
在Designer里面拖一個(gè)Widget出來叫shadowWidget
shadowWidget的顏色為灰色,我們選個(gè)自己喜歡的背景色方便查看
接下來我們要重寫鼠標(biāo)事件函數(shù)才能讓拖拽功能生效
void Widget::mouseMoveEvent(QMouseEvent *event) { QPoint y = event->globalPos();//鼠標(biāo)相當(dāng)于桌面左上角的位置,鼠標(biāo)全局位置 QPoint x = y - this->z; this->move(x); } void Widget::mousePressEvent(QMouseEvent *event) { QPoint y = event->globalPos();//鼠標(biāo)相當(dāng)于桌面左上角的位置,鼠標(biāo)全局位置 QPoint x = this->geometry().topLeft();//窗口左上角位于桌面左上角的位置,窗口位置 this->z = y - x; //定值,不變 } void Widget::mouseReleaseEvent(QMouseEvent *event) { this->z = QPoint(); //鼠標(biāo)松開獲取當(dāng)前的坐標(biāo) }
最終效果變?yōu)槭髽?biāo)可拖動(dòng)的窗口:
源碼:
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); //父窗口設(shè)置透明,只留下子窗口 } Widget::~Widget() { delete ui; } void Widget::mouseMoveEvent(QMouseEvent *event) { QPoint y = event->globalPos();//鼠標(biāo)相當(dāng)于桌面左上角的位置,鼠標(biāo)全局位置 QPoint x = y - this->z; this->move(x); } void Widget::mousePressEvent(QMouseEvent *event) { QPoint y = event->globalPos();//鼠標(biāo)相當(dāng)于桌面左上角的位置,鼠標(biāo)全局位置 QPoint x = this->geometry().topLeft();//窗口左上角位于桌面左上角的位置,窗口位置 this->z = y - x; //定值,不變 } void Widget::mouseReleaseEvent(QMouseEvent *event) { this->z = QPoint(); //鼠標(biāo)松開獲取當(dāng)前的坐標(biāo) }
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
總結(jié)
到此這篇關(guān)于Qt無邊框窗口拖拽和陰影的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Qt無邊框窗口拖拽和陰影內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 使用CRC32檢測內(nèi)存映像完整性的實(shí)現(xiàn)步驟
當(dāng)我們使用動(dòng)態(tài)補(bǔ)丁的時(shí)候,那么內(nèi)存中同樣不存在校驗(yàn)效果,也就無法抵御對方動(dòng)態(tài)修改機(jī)器碼了,為了防止解密者直接對內(nèi)存打補(bǔ)丁,我們需要在硬盤校驗(yàn)的基礎(chǔ)上,增加內(nèi)存校驗(yàn),防止動(dòng)態(tài)補(bǔ)丁的運(yùn)用。2021-06-06typedef_struct與struct之間的區(qū)別
本篇文章主要是對typedef struct與struct之間的區(qū)別進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12C++ 組合 (Composition)的介紹與實(shí)例
這篇文章主要給大家介紹了關(guān)于C++ 組合(Composition)的相關(guān)資料,組合就是將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個(gè)對象和組合對象的使用具有一致性。需要的朋友可以參考下2021-05-05用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版)
大家好,本篇文章主要講的是用C語言實(shí)現(xiàn)圣誕樹(簡易版+進(jìn)階版),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12c++實(shí)現(xiàn)通用參數(shù)解析類示例
使用命令行執(zhí)行程序的時(shí)候在程序后可跟多個(gè)參數(shù)列表,而main函數(shù)的argc和argv分別存儲(chǔ)了相關(guān)的參數(shù)個(gè)數(shù)和參數(shù)內(nèi)容,而循環(huán)輸入相關(guān)的時(shí)候就需要用戶自己來解析相關(guān)參數(shù)。以下代碼用c++的方式實(shí)現(xiàn)了相關(guān)解析的封裝,使用起來非常方便2014-03-03