36.QT-解决无边框界面拖动卡屏问题(附带源码)
2019-02-17 01:47:31来源:博客园 阅读 ()
1.简介
- 看到很多才学QT的人都会问为啥无边框拖动为啥会花屏?
那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了,从而导致花屏.
2.如何解决
我们参考其它软件,比如QQ,浏览器等,可以看到我们如果在拖动它们的时候,会出现一个虚线框.
- 如下图所示,可以看到在白色背景下,拖出的虚线框是黑色的
- 而在黑色背景时,拖出的虚线框是白色的
显然这个虚线框会根据当前桌面的像素点而去取反(也就是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 ) { m_image = QPixmap::grabWindow(QApplication::desktop()->winId()).toImage(); }
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界面如下图所示
5.拖动时的效果图如下所示
6.针对WIN10系统的补充
大家都知道WIN10拖动的话,实现的是实线框,如下图所示:
如果想要这种效果,就将上面代码的paintEvent(QPaintEvent *)函数的i+=2改为i++即可.
修改后效果如下所示:
(PS:在win7下用这个实线框感觉挺别扭的)
上面的两个不同效果的demo源码地址如下所示:
https://download.csdn.net/download/qq_37997682/10955602
原文链接:https://www.cnblogs.com/lifexy/p/10370105.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:L1-030 一帮一
下一篇:L1-033 出生年
- Qt无边框窗口的移动、拉伸边框、鼠标滚轮缩放大小 2019-12-25
- Qt无边框窗体-模拟模态窗体抖动效果 2019-09-23
- Qt无边框窗体-最大化时支持拖拽还原 2019-08-27
- duilib绘制边框 2018-06-27
- duilib绘制边框 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash