网络编程
位置:首页>> 网络编程>> Python编程>> Python开发之QT解决无边框界面拖动卡屏问题(附带源码)

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

作者:诺谦  发布时间:2023-10-31 09:31:29 

标签:QT,无边框,拖动,花屏
目录
  • 1.简介

  • 2.如何解决

  • 3.虚线框类代码

  • 4.测试UI界面如下图所示

  • 5.拖动时的效果图如下所示

1.简介

看到很多才学QT的人都会问为啥无边框拖动为啥会花屏?

那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了,从而导致花屏.

2.如何解决

我们参考其它软件,比如QQ,浏览器等,可以看到我们如果在拖动它们的时候,会出现一个虚线框.

如下图所示,可以看到在白色背景下,拖出的虚线框是黑色的

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

而在黑色背景时,拖出的虚线框是白色的

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

显然这个虚线框会根据当前桌面的像素点而去取反(也就是255-currentRGB).
解决的过程有两种方法:

1)调用win库来实现

2)自己动手写一个

既然我们已经知道它的实现过程.那我们还是自己动手写一个,只需要写一个虚线框类即可

3.虚线框类代码

DragShadow.h


#ifndef DRAGSHADOW_H
#define DRAGSHADOW_H
#include <QtGui>
class DragShadow : public QWidget
{
Q_OBJECT
private:
QImage m_image;
protected:
bool getInvertColor(int x, int y, QColor &color);
void paintEvent(QPaintEvent *);
void showEvent( QShowEvent * event );
public:
explicit DragShadow(QWidget *parent = 0);
void setSizePos(int x, int y, int w, int h);
void setPos(int x,int y );
void setPos(QPoint pos );
signals:

public slots:

};
#endif // DRAGSHADOW_H

DragShadow.cpp


#include "DragShadow.h"
DragShadow::DragShadow(QWidget *parent) :
QWidget(NULL)
{
setWindowFlags(Qt::FramelessWindowHint|Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground);
}
void DragShadow::setSizePos(int x, int y, int w, int h)
{
if(w%2==0)
w+=1;
if(h%2==0)
h+=1;
this->setGeometry(x,y,w,h);
}
void DragShadow::setPos(int x,int y )
{
this->move(x,y);
this->update();
}
void DragShadow::setPos(QPoint pos )
{
this->move(pos);
this->update();
}
void DragShadow::showEvent( QShowEvent * event )
{
   #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))        m_image = QPixmap::grabWindow(QApplication::desktop()->winId()).toImage();   #else        QScreen *screen = QGuiApplication::primaryScreen();        m_image = screen->grabWindow(0).toImage();   #endif
}
void DragShadow::paintEvent(QPaintEvent *)
{
int LineCount=4;
QColor color;
QPainter painter(this);
painter.setBrush(Qt::NoBrush);
QPen pen(Qt::SolidLine);
pen.setColor(Qt::black);
pen.setWidthF(1);
painter.setPen(pen);
painter.drawPoint(0,0);
for(int current=0;current<LineCount;current++)
{
for(int i=current;i<(this->width()-current);i+=2) //x
{
this->getInvertColor(this->x()+i,this->y()+current,color);
pen.setColor(color);
painter.setPen(pen);
painter.drawPoint(i,current);  //draw top
this->getInvertColor(i+this->x(),this->height()-current-1+this->y(),color);
pen.setColor(color);
painter.setPen(pen);
painter.drawPoint(i,this->height()-current-1); //draw bottom
}
for(int i=current;i<(this->height()-current);i+=2) //y
{
this->getInvertColor(current+this->x(),i+this->y(),color);
pen.setColor(color);
painter.setPen(pen);
painter.drawPoint(current,i); //draw left
this->getInvertColor(this->width()-current-1+this->x(),i+this->y(),color);
pen.setColor(color);
painter.setPen(pen);
painter.drawPoint(this->width()-current-1,i); //draw right
}
}
}
bool DragShadow::getInvertColor(int x, int y, QColor &color)
{
int ret=m_image.valid(x,y);
if(ret)
{
QRgb rgb = m_image.pixel(x,y);
color.setRgb(rgb);
color.setRed(255-color.red());
color.setBlue(255-color.blue());
color.setGreen(255-color.green());
}
else
{
color.setRed(0);
color.setBlue(0);
color.setGreen(0);
}
return ret;
}

4.测试UI界面如下图所示

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

5.拖动时的效果图如下所示

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

6.针对实线框补充
对于有些不同的windows系统设置,实现的是实线框,如下图所示:

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

如果想要这种效果,就将上面代码的paintEvent(QPaintEvent *)函数的i+=2改为i++即可.

修改后效果如下所示:

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

上面的两个不同效果的demo源码地址如下所示:

http://xiazai.jb51.net/202105/yuanma/DragTest_jb51.rar

来源:https://www.cnblogs.com/lifexy/p/10370105.html

0
投稿

猜你喜欢

  • 一张表(ColumnTable)的结构如下图所示当前需要实现的功能:通过Number的值为67来获取当前的节点ID、父节点ID递归实现SQL
  • 一、怎么样取得最新版本的MySQL?要安装MySQL,首先要当然要取得它的最新版本,虽然大家都知道在FreeBSD的Packages中可以找
  • 以前看到 andy的关于“Quiet Structure”觉的很不错,于是今天到她的个人站点上逛逛,发现不少好的文章,今天介绍的是
  • 尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一
  • 本文实例讲述了Golang正整数指定规则排序算法问题。分享给大家供大家参考,具体如下:给定字符串内有很多正整数,要求对这些正整数进行排序,然
  • 一般我们可以使用背景图的方式给图片添加阴影,但对于不固定尺寸的图片如何实现呢?我们可以采取“视觉欺骗 * ”——定义渐变边框来实现运行代码框&
  • 一、偏好资源的积累利用DreamWeaver 4制作网页会应用到许多各种类型的要素,比如色彩、图片、模板、脚本等。利用站点资源面板将这些东东
  • 简单替代密码简单替换密码是最常用的密码,包括为每个密文文本字符替换每个纯文本字符的算法.在这个过程中,与凯撒密码算法相比,字母表是混乱的.示
  • 本文实例讲述了php7 参数、整形及字符串处理机制修改。分享给大家供大家参考,具体如下:参数处理机制修改一、重复参数命名不再支持。重复的参数
  • 当服务器必须提供与两个或更多个网络或网络子网的连接时,典型的方案是使用多宿主计算机。此计算机通常位于外围网络(也称为 DMZ、外围安全区域或
  • 废话不多说了,直接给大家贴js代码了,具体代码如下所示:<!DOCTYPE html><html><head&
  • 字符串索引示意图字符串切片也就是截取字符串,取子串Python中字符串切片方法字符串[开始索引:结束索引:步长]切取字符串为开始索引到结束索
  • Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果
  • 解决中文输入的两种应用:在脚本中加语言编码声明 “-*- coding: uft-8 -*-”应用一:print中出现中文方法一:用unic
  • 代码都比较容易理解的,主要就是在以16进制读取图片信息那段代码有点乱,其实仔细看看,也没什么的。glabal.cssbody{}{ &nbs
  • 今天在玩 google earth 4.0b,发现 Print Screen 下来的图片很大,如果直接放在网页上,因为尺寸太大又不合适,又不
  • Python实现对变位词的判断,供大家参考,具体内容如下什么是变位词呢?即两个单词都是由相同的字母组成,而各自的字母顺序不同,譬如pytho
  • 安装模块下面需要用模块,先安装一下:pip install numpy pip install opencv-python==4.5.5.6
  • 在网络浏览器软件中,可以Internet Explorer (IE)现在是一种标准的软件。可以看到,运行不同版本的Windows操作系统(和
  • 本文实例讲述了Symfony2框架创建项目与模板设置的方法。分享给大家供大家参考,具体如下:环境准备与概览习惯于在windows使用netb
手机版 网络编程 asp之家 www.aspxhome.com