2011-05-11 166 views
0

我在Qt 4.7中有一個接口,我有點難以按照自己的意願行事。Qt佈局/小部件交互 - 佈局內的佈局

期望的行爲的基本描述:用戶在組合框中,這會導致查詢去返回QHBoxLayout,負責對象,它一般包括幾個標籤其他功能的選擇,線編輯等,這將調整界面上的佈局內容以刪除先前的選擇,並添加新的細節。

實際發生的事情:新的佈局正在出現,但舊的佈局仍然存在,因此它們彼此重疊,導致一團糟。

這是代碼我有狹槽,該currentIndexChanged信號被鏈接到:

void updateAxisLabels(const QString & value) 
{ 
    if (m_current != "") 
    { 
    QHBoxLayout* xOld = m_transforms[m_current]->xAxis(); 
    m_uiForm.layoutXAxis->removeItem(m_transforms[m_current]->xAxis()); 
    delete m_transforms[m_current]->xAxis(); 
    m_transforms[m_current]->init(); 
    } 

    m_uiForm.layoutXAxis->addLayout(m_transforms[value]->xAxis()); 
    m_current = value; 

    m_uiForm.layoutXAxis->update(); 
} 

這裏m_transforms是地圖的組合框的內容鏈接到的對象與所述x軸()函數(返回一個QHBoxLayout *)和一個init()函數,它將在刪除佈局時重新創建佈局。 m_current只是一個QString,我用它來告訴我需要刪除哪一個。

我刪除它的原因:因爲這是半小時的谷歌搜索導致我相信是正確的做法。

任何幫助非常感謝。 :)

+0

'm_uiFormLayout.layoutXAxis'是什麼類型? QHBoxLayout,負責/ QXBoxLayout/QGridLayout? – beduin 2011-05-11 14:56:13

+0

hi @beduin:這是一個QHBoxLayout。 – TZHX 2011-05-11 16:08:11

+0

我想也許你應該使用[takeAt](http://doc.trolltech.com/latest/qlayout.html#takeAt)和[count](http:// doc)刪除以前存儲在'layoutXAxis'中的項目。 trolltech.com/latest/qlayout.html#count)成員函數。 – beduin 2011-05-11 18:51:15

回答

2

我已經做過這種事情之前,你絕對不僅從佈局中刪除小部件,但也刪除它。

通常,當我這樣做時,我創建了一個專門用於託管我的小部件的佈局。這樣我就可以從佈局中刪除所有內容,而不必擔心可能存在的其他內容。

以下是推薦的方式來遍歷佈局中的所有項目並將其刪除。

QLayoutItem *child; 
while ((child = m_uiForm.layoutXAxis->takeAt(0)) != 0) 
{ 
    delete child; 
} 

那麼你可以調用你想要做的任何清理,然後它會被刪除。你也可以調用layout-> removeWidget(你的小工具)或layout-> removeItem(layout)從佈局中移除一個特定的東西。但你必須小心這一點。該文檔說:

從 佈局中刪除小部件。在此通話之後,主叫方有責任給 小部件設置合理的幾何圖形,或將 小部件放回到佈局中。

因此,您要確保您以後還要刪除小部件,以確保它不會顯示任何位置。

但是,這種方法的另一個問題是,如果您插入/移除的小部件/佈局位於佈局中一堆其他小部件的中間,那麼嘗試替換它時會有很多樂趣在正確的位置。

這就是爲什麼我通常會嘗試創建一個專門爲此目的而沒有其他任何東西的佈局。