从布局中删除QLayoutItem,但以后仍然使用它?

时间:2011-09-26 08:37:36

标签: c++ qt layout widget selection

首先是环境: 我有一个自定义的“属性编辑器”,它是一个QGroupBox(派生自QWidget) 目前我有一个类叫做“Holder”,它引用了两个Property Editors。

现在我有多个“Holder”类和一个垂直QVBoxLayout(称为Sidebar)。 在此布局中,我希望显示当前所选Holder类的两个属性编辑器。

还有一个问题: 当用户选择另一个持有者类时,我希望先前选择的Holder类的属性编辑器消失,并添加新选择的Holder类的属性编辑器。

选择另一个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);
}

2 个答案:

答案 0 :(得分:3)

QLayout::takeAt()不会从其父窗口小部件中删除QLayoutItem的窗口小部件。它似乎第一次工作的唯一原因可能是因为其他小部件高于(z-index wise)第一个。

而不是使用布局,你可以

  • 只要持有人更改隐藏/显示您的2 PropertyEditor,隐藏的项目不会在布局中生成漏洞,下一个可见的项目就会显示为隐藏的项目不是布局的一部分,或者< / LI>
  • 使用QStackedWidget将所有PropertyEditor堆叠在同一位置,然后选择显示哪一个(QStackedWidget::setCurrentIndex())。

答案 1 :(得分:0)

  

“takeAt(..)”是否会破坏持有者类中的引用?

不,此方法从布局中删除QLayoutItem。见reference page for takeAt。此类不会释放布局项(您有责任这样做)。

  

但是当我再次选择第一个Holder课程时,编辑似乎并不是这样   改变。为什么呢?

我不太清楚你想要实现的目标(在你的例子中没有足够的代码),但如果你试图使用QLayoutItem来改变布局,那么最简单的方法是创建新的布局并添加你想要的项目显示它。或者简单地说,从布局中删除所有项目,并添加应该可见的项目。