从代码中访问在用户界面中创建的Qt布局?

22

这可能是我遇到的最愚蠢的问题,但我感到非常困惑。我正在尝试开始使用布局,但出现了一些问题。

我尝试通过在 .ui 文件中拖放 QGridLayout 来添加它到我的项目中。由于我希望在加载时用小部件填充网格,因此我尝试在 "mainwindow.h" 文件中使用 "gridLayout" 对象,同时在调用 this->setupui() 前后都试过。

由于我解决不了这个问题,我选择尝试从头开始使用代码创建它,并将以下内容添加到 main.cpp 文件中。但这也没有显示出来,所以我想知道该如何在加载表单时填充网格。

#include <QtGui/QApplication>
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow w;

    QGridLayout *grid = new QGridLayout;

    QLabel *label1 = new QLabel("test");
    QLabel *label2 = new QLabel("test 2");

    grid->addWidget(label1, 0, 0);
    grid->addWidget(label2, 0, 1);
    w.setLayout(grid);

    w.show();
    return app.exec();
}

具体问题是什么,您添加的小部件没有出现,还是出现在错误的位置? - cmannett85
除非我通过UI编辑器添加它们,否则它们根本不会出现,但是如果我无法通过代码访问布局来填充它。 - user470760
1个回答

28

假设你在QtDesigner中将QGridLayout简单地设置为MainWindow中的centralWidget,就像这样:

enter image description here

你可以通过正确的对象名称(这里是gridLayout)在MainWindow代码中访问它:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->gridLayout->addWidget(new QLabel("hello world"),0,0);
}

如果您在QtDesigner或代码中设置了布局,并且想要更改布局,则QWidget不会让您安装另一个布局,您将收到如下错误消息:

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

在这种情况下,您必须首先删除现有的布局,然后像上面的代码一样安装新的布局。

如果您想在主函数中访问布局,则可以使用QObject :: findChild功能实现此目的,如下所示:

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

    QGridLayout *gridLayout = w.findChild<QGridLayout*>("gridLayout");
    Q_ASSERT(gridLayout);
    gridLayout->addWidget(new QLabel("hello, the second"));

    w.show();
    return a.exec();
}

你给出的第一个例子是我尝试的,虽然我不完全确定我是怎么搞砸的。我相信我试图将其访问为“gridLayout”,而不是它是“ui”的成员。非常感谢您的回复和澄清! - user470760
这对我没用(第一个解决方案)。程序编译了,但没有小部件显示。有什么调试的想法吗? - MrSynAckSter

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