目錄
- 1.簡介
- 2.如何解決
- 3.虛線框類代碼
- 4.測試UI界面如下圖所示
- 5.拖動(dòng)時(shí)的效果圖如下所示
1.簡介
看到很多才學(xué)QT的人都會問為啥無邊框拖動(dòng)為啥會花屏?
那是因?yàn)槟忝看瓮蟿?dòng)的過程中都一直在調(diào)用move()函數(shù)讓QT重新繪制界面,如果資源過大,就會導(dǎo)致當(dāng)前圖形還未繪制完,便又重新改變坐標(biāo)了,從而導(dǎo)致花屏.
2.如何解決
我們參考其它軟件,比如QQ,瀏覽器等,可以看到我們?nèi)绻谕蟿?dòng)它們的時(shí)候,會出現(xiàn)一個(gè)虛線框.
如下圖所示,可以看到在白色背景下,拖出的虛線框是黑色的
而在黑色背景時(shí),拖出的虛線框是白色的
顯然這個(gè)虛線框會根據(jù)當(dāng)前桌面的像素點(diǎn)而去取反(也就是255-currentRGB).
解決的過程有兩種方法:
1)調(diào)用win庫來實(shí)現(xiàn)
2)自己動(dòng)手寫一個(gè)
既然我們已經(jīng)知道它的實(shí)現(xiàn)過程.那我們還是自己動(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;currentLineCount;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.拖動(dòng)時(shí)的效果圖如下所示
6.針對實(shí)線框補(bǔ)充
對于有些不同的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-解決無邊框界面拖動(dòng)卡屏問題(附帶源碼)的詳細(xì)內(nèi)容,更多關(guān)于QT無邊框界面的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 解決PyQt5 無邊框后窗口的移動(dòng)問題
- PyQt5 實(shí)現(xiàn)給無邊框widget窗口添加背景圖片
- Qt無邊框窗口拖拽和陰影的實(shí)現(xiàn)方法
- Qt透明無邊框窗口的實(shí)現(xiàn)示例
- Pyqt實(shí)現(xiàn)無邊框窗口拖動(dòng)以及窗口大小改變
- PyQt5實(shí)現(xiàn)無邊框窗口的標(biāo)題拖動(dòng)和窗口縮放