乐趣区

关于qt:Qt无边框窗口拖拽和阴影

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

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

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

退出移动版