QT介面切換

2021-07-08 15:24:44 字數 4471 閱讀 5597

在開發桌面應用的時候,經常性的會在幾個介面之間切換

可以是區域性的,也可以是整個介面

以前我總是利用hide和show來完成

但是很缺乏動態的美感,使用者在使用的時候體驗不好

今天就來解決這個問題

下面進入正題:

qpropertyanimation

在qt中使用這個類可以很容易的設定一般的動畫

qpropertyanimation *animation =

new qpropertyanimation(&w,"windowopacity");

animation->setduration(1000);

animation->setstartvalue(0);

animation->setendvalue(1);

animation->start();

上面這段**首先繫結乙個widget,這個動畫將接收widget的圖形部分

然後設定整個動畫的時長為1000ms

setstartvalue和setendvalue這裡設定了從0到1

效果就是談入

start以後開始慢慢的出現

當然也可以設定從1到0,效果自然就是淡出了

效果是這樣的

上面的**和淡入淡出不同

我使用了乙個label來獲取整個介面的的大小和影象

然後使用qpropertyanimation 繫結

重點來了,這次我在setstartvalue和setendvalue的時候不是一般的整數,而是使用的整個集合圖形qrect

關於qrect簡單介紹下

qrect用來表示乙個矩形的位置和大小

具體地說就是乙個qpoint(左上角的點)、寬度和高度

有了這幾個引數,這個矩形的位置和大小就統一了

下圖來自官方文件

所以我們實際上我們setstartvalue和setendvalue了乙個矩形的位置和大小

這樣,如果我們的大小不變,只改變qpoint的橫座標,那麼平移的效果就出來了

如下圖,向左側移動

向上或者向下也是可以的

上面兩種情況是這個介面移走,下個介面不動

那麼我想讓這個介面移走的時候下個介面不是不動,而是跟著移動進來呢?

那麼我們就得同時擁有兩個動畫:

移出動畫

移入動畫

而且要動作一致才會有好的效果

qlabel *label = new qlabel(this);

label->resize(this->centralwidget()->size());

label->setpixmap(this->centralwidget()->grab());

label->show();

qpropertyanimation *animation= new qpropertyanimation(label,"geometry");

animation->setduration(500);

animation->setstartvalue(this->centralwidget()->geometry());

animation->setendvalue(qrect(this->centralwidget()->width(), 0, this->centralwidget()->width(), this->centralwidget()->height()));

qpropertyanimation *animation1= new

qpropertyanimation

(this->centralwidget(),"geometry");

animation1->setduration(500);

animation1->setstartvalue(qrect(-this->centralwidget()->width(), 0, this->centralwidget()->width(), this->centralwidget()->height()));

animation1->setendvalue(this->centralwidget()->geometry());

qparallelanimationgroup *group = new

qparallelanimationgroup;

group->addanimation(animation);

group->addanimation(animation1);

group->start();

在上面我們使用了qparallelanimationgroup 這個類

它就像容器一樣可以裝載很多個動畫,然後同時讓它們開始

達到的效果就是這樣的:

qpropertyanimation 同時還支援線性插值操作

animation->setkeyvalueat(0, qrect(0, 0, 00, 00));  

animation->setkeyvalueat(0.4, qrect(20, 250, 20, 30));

animation->setkeyvalueat(0.8, qrect(100, 250, 20, 30));

animation->setkeyvalueat(1, qrect(250, 250, 100, 30));

animation->setendvalue(qrect(250, 250, 100, 30));

動畫會在前40%由qrect(0, 0, 00, 00)移動改變到qrect(20, 250, 20, 30)

然後再40%由qrect(20, 250, 20, 30)移動改變到qrect(100, 250, 20, 30)

最後到qrect(250, 250, 100, 30)

是不是很方便?

qeasingcurve類還提供了很多種線性插值,下面是使用方法

animation->setstartvalue(this->centralwidget()->geometry());

animation->setendvalue(qrect(-this->centralwidget()->width(), 0, this->centralwidget()->width(), this->centralwidget()->height()));

animation->seteasingcurve(qeasingcurve::outbounce);

animation->start();

下圖就是outbounce的線性插值,會有乙個回彈的效果

是不是很棒?還有很多的值可以一一試驗,下面是官方文件截圖

原始碼已經上傳,基於qt 5.5.1

Qt實用技巧 介面切換使用Dialog全屏切換

此需求,使用dialog做即可,可顯示全屏也可不顯示全屏,沒必要使用qwidget,其造成切換時,記憶體釋放問題 實際過程中 new出來的頁面,退出該頁面後delete,再按住alt f4退出程式,應用程式退出後會造成異常表現為出現 停止執行 使用dialog的exec 模態函式顯示對畫框,先使用s...

切換介面的方案(新老介面切換utils)

一 不重要可忽略的介面,一刀切 二 重要的查詢介面,發第一版 新老介面查詢結果對比校驗 充分時間觀察後 日誌檢視技術引數 發第二版 新介面取代老介面 public boolean i target string logidentify,boolean openswitch,listwhitelist...

linux切換介面

本來想研究一下linux的一些命令,結果發現自己安了個圖形介面的,我以為安裝錯了,原來這是linux介面的一種形式,可以切換的,還好搜了一下,不然估計又得安裝一遍,還是度娘好使啊,下面我來說說圖形介面與文字介面切換的快捷鍵,可能有些小差別,反正我的電腦是按以下快捷鍵切換的,這些快捷鍵可能會與自己設定...