如何从QFormLayout中有效删除小部件

时间:2014-05-20 12:30:27

标签: qt

我们有一个动态对话框,我们需要根据用户选择重新配置。在收到某些信号(选择更改等)后,我们必须从QFormLayout中删除所有项目并再次重新填充。

我们尝试了几种方法,但无论我们做什么,旧的小部件都保留在原地,并在此基础上创建新的布局。旧的小部件仍然可以使用,因此它不仅仅是一个绘图问题。

这发生在Kubuntu 14.04上的Qt 5.2.1。

我把它减少到以下情况:

仅包含垂直布局(mainLayout)的QDialog派生类。该布局最初只包含一个空的表单布局(formLayout)。

还有一个更新布局的功能。为简单起见,它总是使用QLineEdit。

版本1:

void Dialog::replaceFields( const QVector< QString > & names )
{
    ui->formLayout->deleteLater() ;
    ui->formLayout = new QFormLayout ;

    ui->mainLayout->addLayout( ui->formLayout ) ;

    for( const QString & name : names )
        ui->formLayout->addRow( name, new QLineEdit ) ;
}

第2版:

void Dialog::replaceFields( const QVector< QString > & names )
{
    while( QLayoutItem * item { ui->formLayout->takeAt( 0 ) } )
        delete item ;

    for( const QString & name : names )
        ui->formLayout->addRow( name, new QLineEdit ) ;
}

两个版本都给出相同的结果。

为了澄清,字段的数量和类型仅在运行时才知道,因此我们无法在编辑器中创建所有变体并只是交换它们。

1 个答案:

答案 0 :(得分:3)

我建议您创建一个QWidget,并将其控件添加到该窗口小部件,而不是添加和删除布局。

然后,您可以根据需要删除窗口小部件并动态重新创建窗口。