Python開(kāi)發(fā)之QT解決無(wú)邊框界面拖動(dòng)卡屏問(wèn)題(附帶源碼)
1.簡(jiǎn)介
看到很多才學(xué)QT的人都會(huì)問(wèn)為啥無(wú)邊框拖動(dòng)為啥會(huì)花屏?
那是因?yàn)槟忝看瓮蟿?dòng)的過(guò)程中都一直在調(diào)用move()函數(shù)讓QT重新繪制界面,如果資源過(guò)大,就會(huì)導(dǎo)致當(dāng)前圖形還未繪制完,便又重新改變坐標(biāo)了,從而導(dǎo)致花屏.
2.如何解決
我們參考其它軟件,比如QQ,瀏覽器等,可以看到我們?nèi)绻谕蟿?dòng)它們的時(shí)候,會(huì)出現(xiàn)一個(gè)虛線框.
如下圖所示,可以看到在白色背景下,拖出的虛線框是黑色的
而在黑色背景時(shí),拖出的虛線框是白色的
顯然這個(gè)虛線框會(huì)根據(jù)當(dāng)前桌面的像素點(diǎn)而去取反(也就是255-currentRGB).
解決的過(guò)程有兩種方法:
1)調(diào)用win庫(kù)來(lái)實(shí)現(xiàn)
2)自己動(dòng)手寫一個(gè)
既然我們已經(jīng)知道它的實(shí)現(xiàn)過(guò)程.那我們還是自己動(dòng)手寫一個(gè),只需要寫一個(gè)虛線框類即可
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.測(cè)試UI界面如下圖所示
5.拖動(dòng)時(shí)的效果圖如下所示
6.針對(duì)實(shí)線框補(bǔ)充
對(duì)于有些不同的windows系統(tǒng)設(shè)置,實(shí)現(xiàn)的是實(shí)線框,如下圖所示:
如果想要這種效果,就將上面代碼的paintEvent(QPaintEvent *)函數(shù)的i+=2改為i++即可.
修改后效果如下所示:
上面的兩個(gè)不同效果的demo源碼地址如下所示:
http://xiazai.jb51.net/202105/yuanma/DragTest_jb51.rar
以上就是QT-解決無(wú)邊框界面拖動(dòng)卡屏問(wèn)題(附帶源碼)的詳細(xì)內(nèi)容,更多關(guān)于QT無(wú)邊框界面的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。