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比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
python脚本监控docker容器
Apr 27 Python
Python中的descriptor描述器简明使用指南
Jun 02 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
python实现银联支付和支付宝支付接入
May 07 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
python中JWT用户认证的实现
May 18 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 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+ajax分页实例简析
2015/12/07 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
浅谈Python 对象内存占用
2016/07/15 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
校园达人秀策划书
2014/01/12 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
2015新学期家长寄语
2015/02/26 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
MySQL优化之慢日志查询
2022/06/10 MySQL