QT如何實現控制項倒影特效

2021-08-14 09:00:22 字數 2803 閱讀 3860

想要為某些控制項不只是加倒影特效,例如:

這樣:

例如:

這樣:

於是,在我的潛心研究之下,終於找到了兩種實現方法:

(一)使用qt的qgraphicseffect類

qgraphicseffect類是乙個強大的特效類,但是官方只有四種用法,做倒影是不夠的,因此,需要我們自己重新定義乙個類來繼承它,重寫它的draw方法,完成我們的倒影特效。具體**如下:

getmirror.h

#ifndef getmirror_h

#define getmirror_h

#include

#include

#include

class

getmirror : public

qgraphicseffect

;#endif // getmirror_h

getmirror.cpp

#include

"getmirror.h"

#include

getmirror::getmirror()

void getmirror::draw(qpainter *painter)

通過重寫draw方法,完成實現倒影特效,然後在mainwindow裡面呼叫,對於all class都有乙個方法叫setgraphicseffect,通過此方法,就可將特效加到widget上面了。

mainwindow.h

#ifndef mainwindow_h

#define mainwindow_h

#include

#include

#include "getmirror.h"

class

mainwindow : public

qmainwindow

;#endif // mainwindow_h

mainwidow.cpp

#include "mainwindow.h"

#include

mainwindow::mainwindow(qwidget *parent)

: qmainwindow(parent)

mainwindow::~mainwindow()

最終實現結果:

但是,這種方法有乙個缺點,它始終是將你所要實現倒影部分的上半部分變為倒影,因為對於qpainter來說,它的整個繪圖區域只有你的目標那麼大。

下來給大家介紹第二種方式,可以只為您所需要的控制項新增倒影特效。

(二)通過qpainter繪製出它的倒影

這種方式理論上來講也不是很難,只需要將所需控制項截圖出來,然後通過qpainter繪製出它的倒影放在相應位置即可。

自己定義乙個widget類,所有的操作只在這個widget上進行。

reflect.h

#ifndef reflect_h

#define reflect_h

#include

#include

#include

#include

class

reflect : public

qwidget

;#endif // reflect_h

reflect.cpp

#include

"reflect.h"

#include

#include

#include

#include

reflect::reflect()

void reflect::paintevent(qpaintevent *)

通過重寫paintevent方法來實現所需特效

mainwindow.h

#ifndef mainwindow_h

#define mainwindow_h

#include

#include

#include "reflect.h"

class

mainwindow : public

qmainwindow

;#endif // mainwindow_h

mainwindow.cpp

#include "mainwindow.h"

#include

mainwindow::mainwindow(qwidget *parent)

: qmainwindow(parent)

mainwindow::~mainwindow()

最終實現結果:

至此,兩種方法已經介紹完畢

最新版傳送門:qt實現控制項倒影特效 2.0:

使用 2D 方法實現倒影特效

倒影特效可以為 ui 帶來絢麗的視覺效果,本文以乙個瀏覽器的 gridview 的例,介紹了一種以 2d 方法實現倒影特效的方法,給出了演算法的 片段。簡介 倒影可以為 ui 介面帶來立體感,是乙個常用的 ui 特效。下圖是乙個瀏覽程式的 gridview5,該 view 的倒影特效為 ui 介面增...

qt實現 標籤控制項

咱先別說啥了,直接上圖 對照圖大體介紹一哈 其實就是乙個視窗設定乙個橫向布局器,左邊乙個label,右邊乙個button 輸入框只要是監視回車事件 外面窗體布局是重點,需要動態去更新布局,動態有兩種 一種是將布局銷毀,重新去new,適合修改複雜布局的窗體 第二種就是動態的去插入 insertwidg...

如何獲取qt控制項的子控制項

我們知道,所有的qt控制項都繼承自qobject,而qobject有乙個屬性叫做objectname。我們可以利用這個屬性。查詢物件的方法,可以利用findchild 和fildchildren 函式原型如下 t qobject findchild const qstring name qstrin...