Qt无边框窗口拖拽和阴影的实现方法

无边框窗口的实现

只需要一行代码即可实现

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

总结

到此这篇关于Qt无边框窗口拖拽和阴影的实现方法的文章就介绍到这了,更多相关Qt无边框窗口拖拽和阴影内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python开发之QT解决无边框界面拖动卡屏问题(附带源码)

    1.简介 看到很多才学QT的人都会问为啥无边框拖动为啥会花屏? 那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了,从而导致花屏. 2.如何解决 我们参考其它软件,比如QQ,浏览器等,可以看到我们如果在拖动它们的时候,会出现一个虚线框. 如下图所示,可以看到在白色背景下,拖出的虚线框是黑色的 而在黑色背景时,拖出的虚线框是白色的 显然这个虚线框会根据当前桌面的像素点而去取反(也就是255-currentRGB).

  • PyQt5 实现给无边框widget窗口添加背景图片

    我就废话不多说了,大家还是直接看代码吧~ #! /usr/bin/env python # -*- coding:utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt from PyQt5.QtGui import QPalette, QBrush, QPixmap class NoBorderWindow(QWidget): def __init__(

  • Pyqt实现无边框窗口拖动以及窗口大小改变

    本文实例为大家分享了Pyqt实现无边框窗口拖动及大小改变的具体代码,供大家参考,具体内容如下 做个记录,绘制边框阴影可以忽略这里不是主要 根据网上某位仁兄Qt的实现转过来的大笑,上完整代码 # coding:utf-8 from PyQt4.Qt import * import sys PADDING=4 sys.setrecursionlimit(10000) class ShadowWidget(QWidget): def __init__(self,parent=None): super(

  • Qt透明无边框窗口的实现示例

    最近在封装一些类的时候,打算做一个窗口框架,能实现拖动.无边框.透明基本样式等功能 0x00 如何透明窗口? 第一步:开启窗口的透明层. setWindowFlags(Qt::FramelessWindowHint); /* 注意:如果单纯开启窗口透明层效果,在Windows系统中必须设置, 其他系统可忽略. */ setAttribute(Qt::WA_TranslucentBackground); 第二步: 重写paintEvent事件并使用QPainter画透明层. void paintE

  • PyQt5实现无边框窗口的标题拖动和窗口缩放

    网上找了半天都找不到好用的PyQt5无边框窗口的实现,借鉴部分前辈的窗口拖放代码,自己实现了一下无边框窗口,问题可能还有一点,慢慢改吧 先做个笔记 py文件 #!/usr/bin/env python #-*- coding:utf-8 -*- from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QVBoxLayout from PyQt5.QtCore import Qt, QPoint from PyQt5.QtGui impo

  • 解决PyQt5 无边框后窗口的移动问题

    由于隐藏了标题栏无法通过点击标题栏来实现窗口的移动,这时候我们可以通过鼠标事件来移动窗口 第一步:判断鼠标左键是否被按下,如果按下则将flag设为True并获取当前的位置 第二步:判断鼠标是否移动并且左键被按下,若移动了计算移动的距离在移动窗口 第三步:若鼠标释放了则将flag设为False 具体做法:重写窗口类自带的三个函数 def mousePressEvent(self, event): if event.button()==Qt.LeftButton: self.m_flag=True

  • Qt无边框窗口拖拽和阴影的实现方法

    无边框窗口的实现 只需要一行代码即可实现 this->setWindowFlags(Qt::FramelessWindowHint); 代码及运行效果: 无边框窗口能拖拽实现 先要去QWidget里面找到 鼠标事件 函数 理一下 坐标的位置 情况: 左上角:屏幕的左上角 中间的窗口:程序的窗口 箭头:鼠标位置 坐标位置满足: x = y - z 在Designer里面拖一个Widget出来叫shadowWidget shadowWidget的颜色为灰色,我们选个自己喜欢的背景色方便查看 接下来我

  • vue electron实现无边框窗口示例详解

    目录 一.前言 二.实现方案 1.创建无边框窗口 2.创建windows窗口控件组件 三.后记 一.前言 无边框窗口是不带外壳(包括窗口边框.工具栏等),只含有网页内容的窗口.对于一个产品来讲,桌面应用带边框的很少,因为丑(我们的UI觉得--与我无关-.-).因此我们就来展开说下,在做无边框窗口时候需要注意的事项以及我踩过的坑. 二.实现方案 1.创建无边框窗口 要创建无边框窗口,只需在 BrowserWindow的 options 中将 frame 设置为 false: const { Bro

  • jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法

    本文实例讲述了jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法.分享给大家供大家参考.具体如下: 这里介绍jQuery图片左右拖拽特效,无滚动条,将多张图片组合在一起形成的效果,插件使用的是jquery.nicescroll.js,拖动过程中不会出现滚动条,这样更美观了一些,若需要此效果,可参见下边框中的代码. 运行效果截图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona

  • Qt自定义图形实现拖拽效果

    本文实例为大家分享了Qt自定义图形实现拖拽效果的具体代码,供大家参考,具体内容如下 在这里自定义图形是通过QPaintEvent事件绘画的图形,也可以通过自定义控件的方式添加到qt中. 首先定义类来自定义图形,这里通过paintEvent事件来实现(主要就是绘画一个图形) void QEventView::paintEvent(QPaintEvent *event) { resize(115+m_iLen,36); QPainter painter(this); painter.setRende

  • Qt利用QDrag实现拖拽拼图功能详解

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 main.cpp 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 4.3 PiecesList类 4.4 PuzzleWidget类 五.效果演示 一.项目介绍 本文介绍利用QDrag类实现拖拽拼图功能.左边是打散的图,拖动到右边进行复现,此外程序还支持手动拖入原图片. 二.项目基本配置 新建一个Qt案例,项目名称为“puzzle”,基类选择“QMainWindow”,取消选中创建

  • C# wpf 无边框窗口添加阴影效果的实现

    目录 前言 一.如何实现? 1.去除边框 2.添加阴影 3.添加触发器 二.示例代码 三.效果预览 总结 前言 制作无边框窗口时,系统自带阴影会消失,这时就需要我自己给窗口添加阴影以防止窗口融入背景.添加阴影的方法很简单,直接用effect就可以了,但这里还是有个不容易注意到的细节需要处理,加阴影后窗口最大化可能会有问题. 一.如何实现? 1.去除边框 (1)方法一 使用WindowStyle可以去除窗口边框,AllowsTransparency+Background制造透明窗口为阴影留出透明边

  • js实现小窗口拖拽效果

    本文实例为大家分享了js实现窗口拖拽的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #box { height: 300px; width: 300px; background-color: green; po

随机推荐