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


Posted in Python onMay 27, 2021

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源码地址如下所示:

https://download.csdn.net/download/qq_37997682/13720244

以上就是QT-解决无边框界面拖动卡屏问题(附带源码)的详细内容,更多关于QT无边框界面的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python and、or以及and-or语法总结
Apr 14 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Python基于select实现的socket服务器
Apr 13 Python
Django验证码的生成与使用示例
May 20 Python
详解python的webrtc库实现语音端点检测
May 31 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
利用Python如何实时检测自身内存占用
May 09 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
pytorch 实现在测试的时候启用dropout
使用Python脚本对GiteePages进行一键部署的使用说明
教你使用Python pypinyin库实现汉字转拼音
基于tensorflow权重文件的解读
May 26 #Python
解决Python字典查找报Keyerror的问题
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
tensorflow中的数据类型dtype用法说明
May 26 #Python
You might like
php获取当前时间的毫秒数的方法
2014/01/26 PHP
Yii配置文件用法详解
2014/12/04 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
Python中的id()函数指的什么
2017/10/17 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
pandas的排序和排名的具体使用
2019/07/31 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
python与mysql数据库交互的实现
2020/01/06 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
幼儿园五一活动方案
2014/02/07 职场文书
餐厅总厨求职信
2014/03/04 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏