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


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


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

目录
相关文章
|
3月前
Qt 布局管理之 停靠窗口QDockWidget
Qt 布局管理之 停靠窗口QDockWidget
72 0
|
5月前
08 QT - Qt窗口坐标体系
08 QT - Qt窗口坐标体系
23 0
|
Windows
关于 Qt设置置顶窗口,透明部分显示黑色底色(已设置透明窗口) 的解决方法
关于 Qt设置置顶窗口,透明部分显示黑色底色(已设置透明窗口) 的解决方法
关于 Qt设置置顶窗口,透明部分显示黑色底色(已设置透明窗口) 的解决方法
|
计算机视觉
Qt实用技巧:实现不规则窗口的鼠标消息穿透,包括穿透到桌面和穿透到父窗口
Qt实用技巧:实现不规则窗口的鼠标消息穿透,包括穿透到桌面和穿透到父窗口
Qt实用技巧:实现不规则窗口的鼠标消息穿透,包括穿透到桌面和穿透到父窗口
|
API 计算机视觉
Qt实用技巧:自定义窗口标题栏
Qt实用技巧:自定义窗口标题栏
Qt实用技巧:自定义窗口标题栏
|
30天前
|
测试技术 API UED
【Qt 应用开发 】初步理解 Qt窗口中的模态性应用
【Qt 应用开发 】初步理解 Qt窗口中的模态性应用
70 1
|
3月前
Qt 控件大小随着窗口的大小而变化设置
Qt 控件大小随着窗口的大小而变化设置
60 0
|
3月前
|
Linux
Qt实现多文档窗口
Qt实现多文档窗口
Qt 调用CMD 并返回结果(隐藏窗口)
Qt 调用CMD 并返回结果(隐藏窗口)
|
10月前
|
程序员 Python
Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
在开发程序时,如果这个程序只有一个窗口,则应该关心这个窗口里面的各个控件之间是如何传递数据的。如果这个程序有多个窗口,那么还应该关心不同的窗口之间是如何传递数据的。 本篇博文首先给出一个例子,说明在一个窗口中不同控件之间的数据是如何传递的。对于多窗口的情况,一般有两种解决方法:一种是主窗口获取子窗口中控件的属性,另一种是通过信号与槽机制,一般是子窗口通过发射信号的形式传递数据,主窗口的槽函数获取这些数据。

热门文章

最新文章

推荐镜像

更多