Я создаю 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);
В чем причина этой странной ситуации? И как это решить?
Чтобы построить дизайн, который вы хотите, первым делом необходимо установить положение элементов, помните, что положение строк или столбцов начинается с 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();
}
Обратите внимание, что QFormLayout будет делать виджеты всегда сверху, поэтому он не обязательно будет занимать высоту пространства, предлагаемого QGridLayout.
Других решений пока нет …