Qt窗體實現類似於PowerPoint 切換頁面的推進效果

如要在下圖中彈出另外一個窗體,並且帶有窗體逐步推進效果













首先,要想在一個窗體中彈出另外一窗體,只需調用show()方法即可,當然要彈出另外一個窗體應該是QDialog或者它的子類。


爲了讓窗體顯示在QMainWindow的相應位置,我們應該想辦法獲取預彈出窗體的位置。由於QDialog的彈出位置是相對於桌面而言的,所以,我們可以先通過pos()方法獲取QMainWindow的主上角位置,在獲取左邊窗體部件相對於QMainWindow而言的相對位置。又由於在QMainWindow中,部件的相對起始位置是窗體的內部空白區域的左上角,所以,在計算預彈出窗體的位置時,還應考慮窗體邊框欄的寬度和主標題欄的高度。


爲了讓QDialog沒有邊框和標題欄,我們設置WindowFlags爲Qt::FramelessWindowHint。但是僅僅這樣設置,彈出窗體外圍仍然又一圈空白區域,這是由於窗體的Margin所造成的。不過如果設置QDialog的Margin爲(0,0,0,0),並起不到預想的效果。通過給窗體佈局(如QGridLayout),此時設置佈局控件的Margin爲(0,0,0,0),就能是彈出的窗體沒有邊框和空白,只有要顯示的內容了。


由於QDialog的resize方法可以讓窗體大小逐漸變化 ,但是注意,一旦窗體內有一定的內容,並且已經佈局正確了的話,注意要把裏面所有控件的sizePolicy設置爲IgnoreFlag,這樣才能保證窗體的內容不會影響窗體的resize效果。

好了,到此,我們只再需要一個定時器,讓窗體的大小逐漸變化,即可實現想要的效果了。

關鍵代碼如下:

int iTitleBarHeight =QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight); //獲取標題欄高度

intiFrameWidth =QApplication::style()->pixelMetric(QStyle::PM_MDIFrameWidth); //獲取邊框寬度

m_qtimer=newQTimer(this);

connect(m_qtimer,SIGNAL(timeout()),this,SLOT(slotTimerOut()));//綁定定時器消息響應函數


m_qtimer ->start(2);   ///啓動定時器,0.002秒時間間隔


voidCExtensionDlg::slotTimerOut()

{

    if(m_bIsPopup )

    {

       //彈出窗體

       if(m_iPercent>100)

       {

           m_qtimer->stop();

           //m_pPopDialog->setFocus();

           return;

       }

       this ->resize(m_size.width()*m_iPercent/100,m_size.height() );

       this ->move(m_point.x(),m_point.y() );

       this ->show();

       m_iPercent += 5;

    }else

    {

       //關閉窗體

       if(m_iPercent<1)

       {

           m_qtimer->stop();

           //m_pPopDialog->setupUI();

           this->hide();

           return;

       }

       this ->resize(m_size.width()*m_iPercent/100,m_size.height() );

       this ->move(m_point.x(),m_point.y() );

       this->show();

       m_iPercent -= 5;

    }

}


注意:在沒有給彈出窗體設置父窗體的時候,運用上述方法能解決實際問題。如果給彈出窗體設置了父窗體,彈出窗體的位置就是相對於父窗體而言,這時,就不需要在獲取邊框欄等寬度了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章