Qt无边框窗口拖拽和暗影


作者:hackett

微信公众号:加班猿

无边框窗口的实现

只须要一行代码即可实现

 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

如果你感觉文章还不错,记得"点赞关注"

关注我的微信公众号【 加班猿 】能够获取更多内容