QFormLayout расширяет столбец QGridLayout - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю QFormLayout с некоторыми элементами вроде этого:

QFormLayout *tableLayout = new QFormLayout();
QLineEdit *line1 = new QLineEdit();
QLineEdit *line2 = new QLineEdit();

tableLayout->addRow(tr("LineText1 "), line1);
tableLayout->addRow(tr("LineText2 "), line2);

После этого я пытаюсь добавить этот макет в QGridLayout следующим образом:

QGridLayout *layout = new QGridLayout();
QPushButton *btn1 = new QPushButton();
QPushButton *btn2 = new QPushButton();
layout->addWidget(btn, 1, 1, 3, 3);
layout->addWidget(btn2, 1, 4);
layout->addLayout(tableLayout, 2, 4);

После того, как я добавил tableLayout, btn1 имеет ширину как 1 столбец, а tableLayout имеет ширину как 3 столбца.

Я уже пытался поместить QFormLayout в собственный виджет и добавить виджет в QGridLayout. Но это ничего не изменило. Я делаю это следующим образом:

QFormLayout *tableLayout = new QFormLayout();
QLineEdit *line1 = new QLineEdit();
QLineEdit *line2 = new QLineEdit();

tableLayout->addRow(tr("LineText1 "), line1);
tableLayout->addRow(tr("LineText2 "), line2);

QWidget *widget = new QWidget();
widget->setLayout(tableLayout);


QGridLayout *layout = new QGridLayout();
QPushButton *btn1 = new QPushButton();
btn1->setText("btn1");
QPushButton *btn2 = new QPushButton();
btn2->setText("btn2");
layout->addWidget(btn1, 1, 1, 3, 3);
layout->addWidget(btn2, 1, 4);
layout->addWidget(widget, 2, 4);

В чем причина этой странной ситуации? И как это решить?

Вот изображение результата: enter image description here

А вот ват, который я хочу иметь: enter image description here

1 Ответ

0 голосов
/ 07 сентября 2018

Чтобы построить дизайн, который вы хотите, первым делом установите положение элементов, помните, что положение строк или столбцов начинается с 0, а не с 1, как вы. Вторая часть состоит в том, чтобы установить политики размера, некоторые виджеты уже имеют некоторую установленную политику, такую ​​как QPushButton, которая растягивается по горизонтали, но не по вертикали, поэтому даже если rowSpan большой, он не изменит высоту кнопки, поэтому мы должны изменить это поведение и, наконец, натяжение.

#include <QApplication>
#include <QFormLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QSizePolicy>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;

    QGridLayout *layout = new QGridLayout(&w);

    QPushButton *btn1 = new QPushButton("Btn1");
    btn1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    QPushButton *btn2 = new QPushButton("Btn2");
    btn2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    QFormLayout *tableLayout = new QFormLayout();
    QLineEdit *line1 = new QLineEdit();
    QLineEdit *line2 = new QLineEdit();
    tableLayout->addRow("LineText1 ", line1);
    tableLayout->addRow("LineText2 ", line2);

    layout->addWidget(btn1, 0, 0, 3, 3);
    layout->addWidget(btn2, 0, 3);
    layout->addLayout(tableLayout, 1, 3);

    // column 0 x3
    layout->setColumnStretch(0, 3);
    // column 3 x1
    layout->setColumnStretch(3, 1);

    w.resize(640, 480);
    w.show();

    return a.exec();
}

enter image description here

Обратите внимание, что QFormLayout будет делать виджеты всегда сверху, поэтому он не обязательно будет занимать высоту пространства, предлагаемого QGridLayout.

...