2011-09-26 91 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的布局,那么它是最简单的创建新的布局和添加项目你想显示它。或者简单地说,从布局中删除所有项目,并添加应该可见的项目。

相关问题