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多线程编程(一):threading模块综述
Apr 05 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Ubuntu下Python2与Python3的共存问题
Oct 31 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
jupyter notebook清除输出方式
Apr 10 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
python实现梯度下降算法的实例详解
Aug 17 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
python中doctest库实例用法
Dec 31 Python
python通过新建环境安装tfx的问题
May 20 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
php生成WAP页面
2006/10/09 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
PHP的几个常用加密函数
2016/02/03 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
js获取ip和地区
2017/03/10 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
python读文件逐行处理的示例代码分享
2013/12/27 Python
Python深入学习之装饰器
2014/08/31 Python
Python中的默认参数详解
2015/06/24 Python
Python+django实现文件上传
2016/01/17 Python
20招让你的Python飞起来!
2016/09/27 Python
Python常用库推荐
2016/12/04 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
后进生转化工作制度
2014/01/17 职场文书
员工保密协议书
2014/09/27 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
食品质检员岗位职责
2015/04/08 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
Python的三个重要函数详解
2022/01/18 Python
Python简易开发之制作计算器
2022/04/28 Python