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的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
Python自动生产表情包
Mar 17 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
python得到电脑的开机时间方法
Oct 15 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
PyQt5实现登录页面
May 30 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
python调用摄像头的示例代码
Sep 28 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
php技巧小结【推荐】
2017/01/19 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
javascript跨域的方法汇总
2015/10/23 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
tab栏切换原理
2017/03/22 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
Python数据结构之图的应用示例
2018/05/11 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
Python hashlib模块的使用示例
2020/10/09 Python
python 写一个性能测试工具(一)
2020/10/24 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
工艺工程师岗位职责
2014/03/04 职场文书
《秋游》教学反思
2014/04/24 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang