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 相关文章推荐
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
python下MySQLdb用法实例分析
Jun 08 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
python中pip的安装与使用教程
Aug 10 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
python 字典item与iteritems的区别详解
Apr 25 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在不同页面间传递Json数据示例代码
2013/06/08 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
PHP基本语法实例总结
2016/09/09 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
django跳转页面传参的实现
2020/09/17 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
优秀大学生的自我评价
2014/01/16 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
企业法律事务工作总结
2015/08/11 职场文书
情况说明书怎么写
2015/10/08 职场文书
会计做账心得体会
2016/01/22 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python