如要在下圖中彈出另外一個窗體,並且帶有窗體逐步推進效果
首先,要想在一個窗體中彈出另外一窗體,只需調用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;
}
}
注意:在沒有給彈出窗體設置父窗體的時候,運用上述方法能解決實際問題。如果給彈出窗體設置了父窗體,彈出窗體的位置就是相對於父窗體而言,這時,就不需要在獲取邊框欄等寬度了。