Qt布局/窗口小部件交互 - 布局中的布局

时间:2011-05-11 11:36:48

标签: c++ qt

我在Qt 4.7中有一个界面,我很难按照自己的意愿行事。

所需行为的基本描述:用户在组合框中进行选择,这会导致查询转到另一个返回QHBoxLayout对象的函数,该对象通常包括多个标签,行编辑等。这将调整界面上布局的内容以删除先前的选择,并添加新的详细信息。

实际上发生了什么:新的布局正在出现,但旧布局仍然存在,因此它们相互叠加,导致混乱。

这是我对插入currentIndexChanged信号的插槽的代码:

void updateAxisLabels(const QString & value)
{
  if ( m_current != "" )
  {
    QHBoxLayout* xOld = m_transforms[m_current]->xAxis();
    m_uiForm.layoutXAxis->removeItem(m_transforms[m_current]->xAxis());
    delete m_transforms[m_current]->xAxis();
    m_transforms[m_current]->init();
  }

  m_uiForm.layoutXAxis->addLayout(m_transforms[value]->xAxis());
  m_current = value;

  m_uiForm.layoutXAxis->update();
}

这里m_transforms是一个映射,它将组合框的内容链接到一个具有xAxis()函数的对象(返回一个QHBoxLayout *),以及一个init()函数,它将在删除时重新创建该布局。 m_current只是一个QString,我用来告诉我需要删除哪一个。

我删除它的原因:因为这是半小时的谷歌搜索让我相信是正确的事情。

任何帮助非常感谢。 :)

1 个答案:

答案 0 :(得分:2)

我以前做过这种事情,你绝对不仅要从布局中删除小部件,还要删除它。

通常当我这样做时,我会创建一个特别用于托管我的小部件的布局。这样我就可以从布局中删除所有内容,而不必担心其中可能存在的任何其他内容。

以下是循环浏览布局中所有项目并将其删除的推荐方法。

QLayoutItem *child;
 while ((child = m_uiForm.layoutXAxis->takeAt(0)) != 0) 
 {
     delete child;
 }

那么你可以在删除它之前调用你想做的任何清理工作。

您还可以调用layout-> removeWidget(您的小部件)或layout-> removeItem(布局)来从布局中删除一个特定的东西。但你必须小心这一点。医生说:

  

从中移除小部件   布局。在这个电话之后,它是   来电者有责任给予   小部件合理的几何形状或放置   小部件回到布局中。

因此,您希望确保之后删除小部件,以确保它不会显示在任何地方。

然而,这种方法的另一个问题是,如果您插入/移除的小部件/布局位于布局中其他小部件的中间位置,那么您将尝试在其中替换它时有很多乐趣正确的位置。

这就是为什么我通常会尝试专门为此目的创建一个布局而没有别的东西。

相关问题