Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否从布局中删除QLayoutItem,但以后仍使用它?_C++_Qt_Layout_Widget_Selection - Fatal编程技术网

C++ 是否从布局中删除QLayoutItem,但以后仍使用它?

C++ 是否从布局中删除QLayoutItem,但以后仍使用它?,c++,qt,layout,widget,selection,C++,Qt,Layout,Widget,Selection,以下是环境第一: 我有一个自定义的“属性编辑器”,它是一个QGroupBox(源自QWidget) 目前我有一个类,我们称之为“Holder”,它引用了两个属性编辑器 现在我有了多个“Holder”类和一个垂直QVBoxLayout(称为边栏)。 在此布局中,我希望显示当前所选Holder类的两个属性编辑器 还有一个问题: 当用户选择另一个holder类时,我希望先前选择的holder类的属性编辑器消失,并添加新选择的holder类的属性编辑器 选择另一个Holder类只工作一次。但是当我再次选

以下是环境第一: 我有一个自定义的“属性编辑器”,它是一个QGroupBox(源自QWidget) 目前我有一个类,我们称之为“Holder”,它引用了两个属性编辑器

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

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

选择另一个Holder类只工作一次。但是当我再次选择第一个Holder类时,编辑器似乎没有改变。为什么?“takeAt(…)”是否破坏holder类中的引用?我怎样才能得到想要的行为

以下是代码,请提前感谢:

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);
}
“takeAt(…)”是否破坏holder类中的引用

否,此方法将从布局中删除QLayoutItem。看见此类不会释放布局项(这是您的责任)

但是,当我再次选择第一个Holder类时,编辑器似乎没有 改变。为什么?

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

QLayout::takeAt()
不会从其父小部件中删除
QLayoutItem
的小部件。它第一次运行的唯一原因可能是因为其他小部件在第一个小部件之上(z-index)

与其玩弄布局,不如

  • 只要隐藏/显示您的2
    属性编辑器
    每当支架发生变化时,隐藏项不会在布局中生成孔,下一个可见项将显示为隐藏项不是布局的一部分,或者
  • 使用
    QStackedWidget
    将所有
    属性编辑器
    堆叠在同一位置,并选择显示哪一个(使用
    QStackedWidget::setCurrentIndex()