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编写一个基于终端的实现翻译的脚本
Apr 24 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
python pygame实现方向键控制小球
May 17 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
Python列表元素删除和remove()方法详解
Jan 04 Python
python+opencv实现车道线检测
Feb 19 Python
Django如何重置migration的几种情景
Feb 24 Python
分析Python list操作为什么会错误
Nov 17 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调用C代码的实现方法
2014/03/11 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript继承方式实例
2010/10/29 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
Python中字符串对齐方法介绍
2015/05/21 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Python自定义一个异常类的方法
2019/06/27 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
高级Java程序员面试题
2016/06/23 面试题
毕业实习个人鉴定范文
2013/12/10 职场文书
环保建议书100字
2014/05/14 职场文书
小学生毕业评语
2014/12/26 职场文书
2015年暑假工作总结
2015/07/13 职场文书
家属联谊会致辞
2015/07/31 职场文书
python可视化之颜色映射详解
2021/09/15 Python
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL