2016-12-18 5 views
0

Я попытался динамически добавлять дополнительные поля для выбора нескольких путей в моем приложении. Unfortunaley Я не в состоянии избавиться от дублирования, что некоторые значки имеют:Избегайте перекрытия виджетов в QVBoxLayout

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

как побочный комментарий, вы должны избавиться от 'findChildren (" browseButton ")' et al, используя lambdas/C++ 11: В addPathEdit do 'connect (browseButton, & QPushButton :: clicked, lineEdit , [this, lineEdit]() {this-> on_browse_button_clicked (lineEdit);}) 'и измените« слот », чтобы получить редактирование строки в качестве аргумента:' void SettingsDialog :: on_browse_button_clicked (QLineEdit * lineEdit) ' – E4z9

ответ

1

В макетах Qt есть «size constraint», который определяет минимальный размер/максимальный размер/размер. Макет, в зависимости от минимального размера/максимального размера/размера.

по умолчанию размер ограничение является QLayout::SetDefaultConstraint, определяется как «Минимальный размер главного виджета устанавливается в MinimumSize(), если виджет уже не имеет минимальный размер

Ваш макет верхнего уровня (диалогового окна) имеет ограничение по умолчанию (в файле .ui), и вы устанавливаете минимальный размер для диалога (в файле .ui), поэтому ограничение эффективно ничего не делает вообще.

Для устранения проблемы вам необходимо либо удалить минимальный размер диалогового окна (например, выбрать значение свойства .ui-редактор и щелкнуть стрелку назад), либо установить ограничение размера макета верхнего уровня на QLayout::SetMinimumSize ,

+0

Спасибо! Я не понял, для какого макета мне нужно было установить это свойство. Но теперь ясно. – minils

Смежные вопросы