Qt去掉標題欄之後新增邊框陰影的解決方案

2021-09-02 22:50:37 字數 4049 閱讀 9922

我們經常需要自定義標題欄,那麼去掉標題欄是非常有必要。但是去掉標題欄之後邊框陰影也會消失,感覺光禿禿的,不太舒服。接下來我們將討論新增邊框陰影的幾種解決方案。

如果是windows平台,那麼可以呼叫windows相關api。

使用qt的qgraphicsdropshadoweffect類來實現。

使用qt的qdrawborderpixmap函式來實現。

自己構造出邊框陰影qimage並繪製(參考為知筆記原始碼)。

#include

"winapishadowwidget.h"

#include

"windwmapi.h"

winapishadowwidget::

winapishadowwidget

(qwidget *parent)

:qwidget

(parent)

; windwmapi::

instance()

->

dwmextendframeintoclientarea

(hwnd

(winid()

),&shadow);}

bool winapishadowwidget::

nativeevent

(const qbytearray &eventtype,

void

*message,

long

*result)

default

:return qwidget::

nativeevent

(eventtype, message, result);}

}...

hresult windwmapi::

dwmextendframeintoclientarea

(hwnd hwnd,

const margins *pmarinset)

const

return e_notimpl;}.

..if(dwmapi_dll_)

效果圖:

qgraphicsdropshadoweffect類提供了乙個投影效果。可以使用setcolor()函式修改投影的顏色。可以使用setoffset()函式修改陰影偏移量,使用setblurradius()函式修改陰影的半徑。預設情況下,投影是半透明的深灰色(qcolor(63, 63, 63, 180)陰影,模糊半徑為1,向右下角偏移8個畫素。將乙個qwidget嵌入到另乙個qwidget中,被嵌入的qwidget背景透明。

shadoweffectwidget::

shadoweffectwidget

(qwidget *parent)

:qwidget

(parent)

效果圖:

qdrawborderpixmap函式用於將乙個畫素圖繪製到乙個矩形的邊緣。使用給定的繪圖器將給定的畫素對映繪製到給定的目標矩形中。pixmap將被分割成九個部分,並根據邊緣結構繪製。需要我們提前做好邊框陰影的。但是據說這種方式效率並不高,有待考證。

drawborderpixmapwidget::

drawborderpixmapwidget

(qwidget *parent)

:qwidget

(parent)

void drawborderpixmapwidget::

paintevent

(qpaintevent *e)

效果圖:

這種方式稍微麻煩點,但是比較靈活,效率也很可觀,推薦使用。**有點多,先上主要的。

inline

unsigned

char

makealpha

(int i,

double f,

int nsize)

qimage makeshadowimage

(int shadowsize,

bool activated)

}//right

for(

int y = shadowsize; y < szimage.

height()

- shadowsize; y++)}

//top

for(

int y =

0; y < shadowsize; y++)//

}//bottom

for(

int y = szimage.

height()

- shadowsize -

1; y < szimage.

height()

; y++)}

//int parentroundsize =3;

//for

(int x =

0; x < shadowsize + parentroundsize; x++)}

//for

(int x = szimage.

width()

- shadowsize - parentroundsize; x < szimage.

width()

; x++)}

//for

(int x =

0; x < shadowsize + parentroundsize; x++)}

//for

(int x = szimage.

width()

- shadowsize - parentroundsize; x < szimage.

width()

; x++)}

//int borderr =

165;

int borderg =

165;

int borderb =

165;

//if

(activated)

//int bordersize =1;

//left

for(

int i =

0; i < bordersize; i++)}

//right

for(

int i =

0; i < bordersize; i++)}

//top

for(

int i =

0; i < bordersize; i++)}

//bottom

for(

int i =

0; i < bordersize; i++)}

//return image;

}

調節陰影大小時,只需要調節shadowsize的大小即可。

shadowwidget::

shadowwidget

(int shadowsize, qwidget *parent)

:m_shadowsize

(shadowsize)

,qwidget

(parent)

,m_shadow

(new

skin9gridimage()

)void shadowwidget::

paintevent

(qpaintevent *e)

效果圖:

QT 去掉標題欄和去掉標題欄後移動視窗

在用qt編寫介面時,去掉標題欄方法比較簡單,就一行 this setwindowflags qt framelesswindowhint 去掉以後又發現乙個問題,就是不能移動視窗了,於是我就重寫了三個滑鼠事件,大致 如下 h檔案的 include protected void mousepresse...

Qt學習筆記(七)自製標題欄 邊框陰影 圓角效果

this setwindowflags qt framelesswindowhint 去除qt自帶的標題欄去除標題欄後為了實現窗體的視窗最大化 最小化 關閉以及移動事件,需要自定義以下操作 自製qpushbutton按鈕,連線到showmax 事件上 void qixin companyitemcl...

android 如何去掉標題欄

在android中去掉標題欄有三種方法,它們也有各自的特點。1.在 裡實現 this requestwindowfeature window.feature no title 去掉標題欄 這句 要寫在setcontentview 前面。2.在清單檔案 manifest.xml 裡面實現 3.在sty...