2011-05-11 130 views
0

我在Qt 4.7中有一个接口,我有点难以按照自己的意愿行事。Qt布局/小部件交互 - 布局内的布局

期望的行为的基本描述:用户在组合框中,这会导致查询去返回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是地图的组合框的内容链接到的对象与所述x轴()函数(返回一个QHBoxLayout *)和一个init()函数,它将在删除布局时重新创建布局。 m_current只是一个QString,我用它来告诉我需要删除哪一个。

我删除它的原因:因为这是半小时的谷歌搜索导致我相信是正确的做法。

任何帮助非常感谢。 :)

+0

'm_uiFormLayout.layoutXAxis'是什么类型? QHBoxLayout,负责/ QXBoxLayout/QGridLayout? – beduin 2011-05-11 14:56:13

+0

hi @beduin:这是一个QHBoxLayout。 – TZHX 2011-05-11 16:08:11

+0

我想也许你应该使用[takeAt](http://doc.trolltech.com/latest/qlayout.html#takeAt)和[count](http:// doc)删除以前存储在'layoutXAxis'中的项目。 trolltech.com/latest/qlayout.html#count)成员函数。 – beduin 2011-05-11 18:51:15

回答

2

我已经做过这种事情之前,你绝对不仅从布局中删除小部件,但也删除它。

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

以下是推荐的方式来遍历布局中的所有项目并将其删除。

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

那么你可以调用你想要做的任何清理,然后它会被删除。你也可以调用layout-> removeWidget(你的小工具)或layout-> removeItem(layout)从布局中移除一个特定的东西。但你必须小心这一点。该文档说:

从 布局中删除小部件。在此通话之后,主叫方有责任给 小部件设置合理的几何图形,或将 小部件放回到布局中。

因此,您要确保您以后还要删除小部件,以确保它不会显示任何位置。

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

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