QFormLayout扩展了QGridLayout的列

3

我正在创建一个包含以下项目的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之后,按钮1的宽度为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

您可以添加可扩展(大小策略)的小部件,而不是使用tableLayout,并将tableLayout设置为此小部件。链式结构如下:layout->widget->tableLayout。 - Deep
除了错别字之外,该代码完全按照指示执行:btn1位于第一行,跨越3行和3列,btn2位于第4行,紧挨着表单布局。那么问题到底是什么? - scopchanov
@scopchanov 你是对的,这样做确实达到了预期的效果。在我的例子中,我混淆了addWidget的行和列。对此我感到抱歉。我已经进行了更改。 - NelDav
@Ahrtaler你说:我已经尝试将QFormLayout放入自己的小部件中,并将该小部件添加到QGridLayout中。但是它没有改变任何东西。。你可以放置你正在使用的代码,我们称之为[mcve],同时展示一张你得到的图像和你想要获得的图像也会很有趣。 - eyllanesc
@Ahrtaler 你想要获得什么? - eyllanesc
显示剩余2条评论
1个回答

3

建立想要的设计的第一步是确定元素的位置,记住行或列的位置从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提供的高度空间。

1
非常感谢!我完全误解了QGridLayout。我一直以为它是一个均匀的网格。如果你想让一个元素变大,你必须添加更多的列和行。但是使用这种方式要好得多。感谢您花费这么多时间帮助我。 - NelDav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接