15

(デザイナーではなく) コードを使用してウィジェットのレイアウトを手動で設定しようとしていますが、次の警告が表示されるため、何か問題があります。

QWidget::setLayout: 既にレイアウトがある Widget "" で QLayout "" を設定しようとしています

また、レイアウトが台無しになっています (ラベルが下部ではなく上部にあります)。

これは、問題を再現するサンプル コードです。

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    QLabel *label = new QLabel("Test", this);
    QHBoxLayout *hlayout = new QHBoxLayout(this);
    QVBoxLayout *vlayout = new QVBoxLayout(this);
    QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Fixed);
    QLineEdit *lineEdit = new QLineEdit(this);
    hlayout->addItem(spacer);
    hlayout->addWidget(lineEdit);
    vlayout->addLayout(hlayout);
    vlayout->addWidget(label);
    setLayout(vlayout);
}
4

2 に答える 2

16

だから私はあなたの問題がこの行にあると信じています:

QHBoxLayout *hlayout = new QHBoxLayout(this);

this特に、問題は に渡っていると思いますQHBoxLayoutQHBoxLayoutこれを の最上位レイアウトにしないことを意図しているため、コンストラクターにthis渡すべきではありません。this

これは、ローカルでテストアプリにハッキングして、うまく機能しているように見える私の書き直しです。

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    QLabel *label = new QLabel("Test");
    QHBoxLayout *hlayout = new QHBoxLayout();
    QVBoxLayout *vlayout = new QVBoxLayout();
    QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Fixed);
    QLineEdit *lineEdit = new QLineEdit();
    hlayout->addItem(spacer);
    hlayout->addWidget(lineEdit);
    vlayout->addLayout(hlayout);
    vlayout->addWidget(label);
    setLayout(vlayout);
}
于 2012-05-09T16:02:23.223 に答える
6

問題は、の親を使用してレイアウトを作成していることですthis。これを行うと、レイアウトがのメインレイアウトに設定されますthis。したがって、を呼び出すのは冗長setMainLayout()です。

于 2012-05-09T15:51:43.417 に答える