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用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
python3 使用traceback定位异常实例
Mar 09 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
Python编写单元测试代码实例
Sep 10 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
Python实现京东抢秒杀功能
Jan 25 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 Python
使用python绘制分组对比柱状图
Apr 21 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
B2K与车机的中波PK
2021/03/02 无线电
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php变量作用域的深入解析
2013/06/03 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
Django日志及中间件模块应用案例
2020/09/10 Python
城管综合整治方案
2014/05/01 职场文书
民事辩护词范文
2015/05/21 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
初中地理教学反思
2016/02/19 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
vue实力踩坑之push当前页无效
2022/04/10 Vue.js