2011-09-26 89 views
1

這裏是環境第一: 我有一個自定義的「屬性編輯器」,這是一個QGroupBox(從QWidget派生) 目前我有一個類,我們稱之爲「持有人」,其中有兩個屬性編輯器。從佈局中移除QLayoutItem,但稍後仍然使用它?

現在我有多個「持有者」類和一個垂直QVBoxLayout(稱爲邊欄)。 在此佈局中,我希望顯示當前選定Holder類的兩個屬性編輯器。

還有問題: 當用戶選擇另一個持有人類時,我希望先前選定的持有人類的Property Editors消失,並添加新選定持有人類的Property Editors。

選擇另一個Holder類一次。但是當我再次選擇第一個Holder類時,編輯似乎沒有改變。爲什麼? 「takeAt(..)」是否會破壞持有者類中的引用?我怎樣才能獲得理想的行爲?

下面是代碼,在此先感謝:

void App::setSelection(Holder * holder){ 
    if(m_currentlySelected == holder) return; 

    m_viewer->sideBarRemoveAt(0); 
    m_viewer->sideBarInsertAt(0, holder->firstPropEditor); 
    m_viewer->sideBarRemoveAt(1); 
    m_viewer->sideBarInsertAt(1, holder->secondPropEditor); 

    m_currentlySelected = holder; 
} 

void QtViewer::sideBarRemoveAt(int i){ 
    m_sideBar->m_layout->takeAt(i); 
} 

void QtViewer::sideBarInsertAt(int i, QWidget * widget){ 
    m_sideBar->m_layout->insertWidget(i, widget); 
} 

回答

3

QLayout::takeAt()不會從其父控件中刪除QLayoutItem的控件。看起來第一次工作的唯一原因可能是因爲其他小部件高於(z-index智慧)第一個。

而不是與佈局玩,你可以

  • 只是隱藏/顯示您2 PropertyEditor只要持有人的變化,隱藏的項目不產生在佈局孔,下一個可見項顯示爲如果隱藏的項目不是佈局的一部分,或者
  • 使用QStackedWidget將所有PropertyEditor堆疊在相同位置並選擇顯示哪一個(使用QStackedWidget::setCurrentIndex())。
+0

對不起,您對。我刪除了我的評論。 – TonyK

0

是否 「takeAt(..)」 消滅在支架類的參考?

不,這種方法從佈局中刪除QLayoutItem。見reference page for takeAt。此課程不會發布布局項目(這是您的責任)。

但是,當我再次選擇第一個Holder類時,編輯器似乎不會改變 。爲什麼?

我不太清楚你要實現的目標(在你的例子不夠代碼)是什麼,但如果你想改變使用QLayoutItem的佈局,那麼它是最簡單的創建新的佈局和添加項目你想顯示它。或者簡單地說,從佈局中刪除所有項目,並添加應該可見的項目。

相關問題