4

チェステーブルと、チェステーブルの下に2行で表示される6つのボタンを含むウィジェットを作成しています。ボタンの行はチェスのテーブルよりも幅が広いです。チェスのテーブルとボタンはQGridLayoutにあります。チェステーブルには、正方形のサイズから計算された独自のsizeHintがあります。

いくつかの操作の後、ボタンを削除し、すべてを含むウィジェットのサイズをsizeHint(resize(sizeHint()))に変更します。ウィジェットは垂直方向に適切にサイズ変更されますが、水平方向では、ボタンの行がそこにあるかのように幅が維持されます。何が問題ですか ?

チェステーブルのみを使用してウィジェットを作成すると、レイアウトはウィジェットのサイズを適切に設定します。

私はコードを追加しています:

ウィンドウのコンストラクター:

renderArea = new RenderArea(m_row,m_col,m_grid);

formLayout = new QGridLayout;

formLayout->addWidget(renderArea,0,0,1,3);

setLayout(formLayout);

ボタンを追加する関数では:

addPlaneButton = new QPushButton(tr("Add plane"));
cancelButton = new QPushButton(tr("Cancel operation"));
movePlaneButton = new QPushButton(tr("Move plane"));
deletePlaneButton = new QPushButton(tr("Delete plane"));
rotatePlaneButton = new QPushButton(tr("Rotate plane"));
doneButton = new QPushButton(tr("Done"));
doneButton->setEnabled(false);

infoLabel = new QLabel(tr("Welcome to the plane editor"));
statusLabel = new QLabel();

formLayout->addWidget(statusLabel,1,0,1,3);
formLayout->addWidget(infoLabel,2,0,1,3);
formLayout->addWidget(addPlaneButton,3,0);
formLayout->addWidget(movePlaneButton,3,1);
formLayout->addWidget(deletePlaneButton,3,2);
formLayout->addWidget(rotatePlaneButton,4,0);
formLayout->addWidget(cancelButton,4,1);
formLayout->addWidget(doneButton, 4,2);

チェステーブル以外のすべてを削除する関数では、次のようになります。

formLayout->removeWidget(addPlaneButton);
formLayout->removeWidget(cancelButton);
formLayout->removeWidget(movePlaneButton);
formLayout->removeWidget(deletePlaneButton);
formLayout->removeWidget(rotatePlaneButton);
formLayout->removeWidget(doneButton);
formLayout->removeWidget(infoLabel);
formLayout->removeWidget(statusLabel);


delete addPlaneButton;
delete cancelButton;
delete movePlaneButton;
delete deletePlaneButton;
delete rotatePlaneButton;
delete doneButton;


delete infoLabel;
delete statusLabel;

resize(sizeHint());

チェステーブルのsizeHintは、次のように計算されます。

return QSize(m_rowNo*spacing, m_colNo*spacing)+QSize(31,31);
4

1 に答える 1

4
  1. レイアウトされたウィジェットを変更した直後に、activate()その の前にレイアウトを更新しsizeHint()、続いてウィジェットのを更新する必要があります。sizeHint()

  2. への呼び出しlayout->removeWidget()は冗長です。単にdelete不要なウィジェット。Qt は、QWidget 階層内のすべてのメモリ割り当てを処理します。Qt 側の誰にも言わずに QWidget を削除しても安全です。もちろん、まともな例外もあります。たとえば、メソッドがコール スタックのどこかにあるウィジェットを削除することはできません。

  3. の呼び出しに煩わされたくない場合はresize()、ウィジェットのレイアウトに適切なサイズ制限を設定できます。例えば:

    layout->setSizeConstraint(QLayout::SetFixedSize);

    これにより、ウィジェットのサイズは、sizeHint().

ポイント 1 と 2 を考慮すると、「チェス テーブル以外のすべてを削除する」関数は次のようになります。

void removeButtons() {
    delete addPlaneButton;
    delete cancelButton;
    delete movePlaneButton;
    delete deletePlaneButton;
    delete rotatePlaneButton;
    delete doneButton;
    delete infoLabel;
    delete statusLabel;

    formLayout->activate();
    resize(sizeHint());
}
于 2012-06-18T22:40:48.833 に答える