首先是环境: 我有一个自定义的“属性编辑器”,它是一个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);
}
答案 0 :(得分:3)
QLayout::takeAt()
不会从其父窗口小部件中删除QLayoutItem
的窗口小部件。它似乎第一次工作的唯一原因可能是因为其他小部件高于(z-index wise)第一个。
而不是使用布局,你可以
PropertyEditor
,隐藏的项目不会在布局中生成漏洞,下一个可见的项目就会显示为隐藏的项目不是布局的一部分,或者< / LI>
QStackedWidget
将所有PropertyEditor
堆叠在同一位置,然后选择显示哪一个(QStackedWidget::setCurrentIndex()
)。答案 1 :(得分:0)
“takeAt(..)”是否会破坏持有者类中的引用?
不,此方法从布局中删除QLayoutItem。见reference page for takeAt。此类不会释放布局项(您有责任这样做)。
但是当我再次选择第一个Holder课程时,编辑似乎并不是这样 改变。为什么呢?
我不太清楚你想要实现的目标(在你的例子中没有足够的代码),但如果你试图使用QLayoutItem来改变布局,那么最简单的方法是创建新的布局并添加你想要的项目显示它。或者简单地说,从布局中删除所有项目,并添加应该可见的项目。