我们有一个动态对话框,我们需要根据用户选择重新配置。在收到某些信号(选择更改等)后,我们必须从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 ) ;
}
两个版本都给出相同的结果。
为了澄清,字段的数量和类型仅在运行时才知道,因此我们无法在编辑器中创建所有变体并只是交换它们。
答案 0 :(得分:3)
我建议您创建一个QWidget,并将其控件添加到该窗口小部件,而不是添加和删除布局。
然后,您可以根据需要删除窗口小部件并动态重新创建窗口。