2016-12-18 3 views
0

私のアプリケーションでは複数のフィールドを動的に追加して選択しようとしました。 Unfortunaleyは、私はいくつかのアイコンが持っていることを、重複を取り除くことはできませんよ。QVBoxLayoutにウィジェットが重複しないようにする

enter image description here

私は次のコードでそれらを追加:pathHolderLayoutはQVBoxLayoutです

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++; 
} 

何か助けていただければ幸いです。

+0

これは、通常、レイアウト制約が階層まで正しくダイアログにプッシュアップされないことを意味します。問題の最小限の実例を作成できますか? – E4z9

+0

@ E4z9ソースコード全体[ここ](https://github.com/minils/EasySlideshow)が見つかります。 – minils

+0

をサイドコメントとして使用するには、lambdas/C++ 11を使用して 'findChildren (" browseButton ")などを取り除く必要があります11:addPathEditで' connect(browseButton、&QPushButton :: clicked、lineEdit (void)」をクリックし、行編集を引数として取得するように「slot」を変更します。void SettingsDialog :: on_browse_button_clicked(QLineEdit * lineEdit) – E4z9

答えて

1

Qtのレイアウトには、コンテンツのminimumSize/maximumSize/sizeHintに応じてレイアウトのminimumSize/maximumSize/sizeHintを定義する "size constraint"があります。

デフォルトサイズの制約は、「ウィジェットの最小サイズがすでにでない限り、メインウィジェットの最小サイズはminimumSize()、に設定されています」と定義されていますQLayout::SetDefaultConstraintです。

デフォルトのサイズ制約(.uiファイル内)があり、ダイアログ(.uiファイル内)の最小サイズが設定されているため、制約は効果的に何もしませんまったく。

問題を修正するには、ダイアログボックスの最小サイズを削除するか(たとえば、.uiエディタの値を選択して戻る矢印をクリックする)、トップレベルレイアウトのサイズ制約をに設定する必要があります。

+0

ありがとう!このプロパティを設定する必要があるレイアウトはわかりませんでした。しかし、今は明らかです。 – minils

関連する問題