Qt无边框窗口拖拽和阴影

简介: 无边框窗口的实现

无边框窗口的实现


只需要一行代码即可实现


this->setWindowFlags(Qt::FramelessWindowHint);


1.png


代码及运行效果:


2.png


无边框窗口能拖拽实现


先要去QWidget里面找到鼠标事件函数


3.png


理一下坐标的位置情况:


左上角:屏幕的左上角

中间的窗口:程序的窗口

箭头:鼠标位置

坐标位置满足:x = y - z


4.png


在Designer里面拖一个Widget出来叫shadowWidget


5.png


shadowWidget的颜色为灰色,我们选个自己喜欢的背景色方便查看


6.png


接下来我们要重写鼠标事件函数才能让拖拽功能生效


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(); //鼠标松开获取当前的坐标
 }


最终效果变为鼠标可拖动的窗口:


7.png


源码:


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窗口 | 标准对话框 | 消息对话框QMessageBox
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
2716 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
|
C++ Windows
Qt 窗口置顶
Qt 窗口置顶
745 1
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
4635 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
1846 3
|
数据可视化
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
821 3
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
3294 3
【qt】视口和窗口坐标
【qt】视口和窗口坐标
436 0
|
算法 数据安全/隐私保护
【qt】启动窗口的玩法
【qt】启动窗口的玩法
327 0
【qt】多窗口开发
【qt】多窗口开发
382 0