避免QVBoxLayout中的Widgets重叠

问题描述:

我试图动态添加更多的字段来选择我的应用程序中的多个路径。 Unfortunaley我无法摆脱的重叠,有些图标有:避免QVBoxLayout中的Widgets重叠

enter image description here

我将它们添加下面的代码:

void SettingsDialog::addPathEdit(QString dir) 
{ 
    if (amountPaths > maxAmountPaths) { 
     showError(tr("Cannot add more than %1 paths").arg(maxAmountPaths)); 
     return; 
    } 
    QHBoxLayout *hLayout = new QHBoxLayout(); 
    hLayout->setObjectName("pathLine"); 
    hLayout->setSizeConstraint(QHBoxLayout::SetMinimumSize); 

    QLineEdit *lineEdit = new QLineEdit(dir); 
    lineEdit->setMinimumHeight(25); 
    lineEdit->setObjectName("path"); 
    hLayout->addWidget(lineEdit); 

    QPushButton *browseButton = new QPushButton(tr("Browse...")); 
    browseButton->setMinimumHeight(25); 
    browseButton->setObjectName("browseButton"); 
    hLayout->addWidget(browseButton); 
    connect(browseButton, SIGNAL(clicked()), this, SLOT(on_browse_button_clicked())); 

    ui->pathHolderLayout->addLayout(hLayout); 
    amountPaths++; 
} 

其中pathHolderLayout是QVBoxLayout。

任何帮助表示赞赏。

+0

这通常意味着布局约束不能正确地向上推到层次结构直到对话框。你能为你的问题创建一个最小的工作示例吗? – E4z9

+0

@ E4z9你可以在这里找到整个源代码(https://github.com/minils/EasySlideshow)。 – minils

+0

作为一个方面的评论,你应该通过使用lambdas/C++ 11摆脱'findChildren (“browseButton”)等等:在addPathEdit中执行'connect(browseButton,&QPushButton :: clicked,lineEdit ,[this,lineEdit](){this-> on_browse_button_clicked(lineEdit);})'并更改“slot”以获得行编辑参数:'void SettingsDialog :: on_browse_button_clicked(QLineEdit * lineEdit)' – E4z9

Qt中的布局具有“size constraint”,它定义布局的minimumSize/maximumSize/sizeHint,具体取决于其内容的minimumSize/maximumSize/sizeHint。

默认尺寸限制为QLayout::SetDefaultConstraint,定义为“主控件的最小尺寸设置为minimumSize(),,除非控件已经具有最小尺寸”。

您的顶层布局(对话框)具有默认的大小限制(在.ui文件中),并且您为对话框设置了最小大小(在.ui文件中),因此约束无效在所有。

要解决您的问题,您必须删除对话框的最小尺寸(例如选择.ui编辑器的属性值并单击向后箭头),或将顶层布局的尺寸约束设置为QLayout::SetMinimumSize

+0

谢谢!我不明白我需要设置此属性的布局。但现在很明显。 – minils