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实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
django实现用户登陆功能详解
Dec 11 Python
python实现音乐下载的统计
Jun 20 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
Python简单I/O操作示例
Mar 18 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
python requests使用socks5的例子
Jul 25 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
python 内置函数汇总详解
Sep 16 Python
Python实现图片识别加翻译功能
Dec 26 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
Python定时任务APScheduler原理及实例解析
May 30 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各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
短信提示使用 特效
2007/01/19 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
js读写json文件实例代码
2014/10/21 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
Python实现网站文件的全备份和差异备份
2014/11/30 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python 读写中文json的实例详解
2017/10/29 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
次世代生活态度:Hypebeast
2018/07/05 全球购物
台湾家适得:Homeget
2019/02/11 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
绿色学校实施方案
2014/03/31 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
党员志愿者活动方案
2014/08/28 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
计算机专业自荐信
2015/03/05 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
javascript实现计算器功能详解流程
2021/11/01 Javascript
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android