C++ 从代码访问在UI中创建的Qt布局?

C++ 从代码访问在UI中创建的Qt布局?,c++,qt,layout,widget,qt-creator,C++,Qt,Layout,Widget,Qt Creator,这可能是我遇到过的最愚蠢的问题,但我非常困惑。我正在尝试开始布局,但由于某些原因,我无法理解这一点 我尝试通过.ui文件添加QGridLayout,只需将其拖放到我的项目中。由于我想在加载时用小部件填充网格,所以我尝试在调用this->setupui()之前/之后使用“mainwindow.h”文件中的“gridLayout”对象 由于我无法理解这一点,我选择使用代码从头开始创建它,并将以下内容添加到main.cpp文件中。这也没有显示,所以我想知道当表单加载时,我究竟如何填充网格 #inclu

这可能是我遇到过的最愚蠢的问题,但我非常困惑。我正在尝试开始布局,但由于某些原因,我无法理解这一点

我尝试通过.ui文件添加QGridLayout,只需将其拖放到我的项目中。由于我想在加载时用小部件填充网格,所以我尝试在调用this->setupui()之前/之后使用“mainwindow.h”文件中的“gridLayout”对象

由于我无法理解这一点,我选择使用代码从头开始创建它,并将以下内容添加到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();
}
#包括
#包括
#包括“mainwindow.h”
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
主窗口w;
QGridLayout*grid=新的QGridLayout;
QLabel*label1=新的QLabel(“测试”);
QLabel*label2=新的QLabel(“测试2”);
grid->addWidget(标签1,0,0);
grid->addWidget(标签2,0,1);
w、 设置布局(网格);
w、 show();
返回app.exec();
}

假设您只需在主窗口中将QtDesigner中的QGridLayout设置为centralWidget,如下所示:

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):

如果您在QtDesigner或代码中设置了布局,并且希望更改布局,QWidget将不允许您安装另一个布局,您将收到如下错误消息:

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();
}
QWidget::setLayout:尝试在已具有布局的MainWindow“MainWindow”上设置QLayout“”

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

如果要访问主函数中的布局,可以通过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();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
QGridLayout*gridLayout=w.findChild(“gridLayout”);
Q_断言(网格布局);
gridLayout->addWidget(新的QLabel(“你好,第二个”);
w、 show();
返回a.exec();
}

到底是什么问题,您添加的小部件没有出现,还是出现在错误的位置?除非我通过UI编辑器添加它们,否则它们根本不会出现,在这种情况下,我似乎无法通过代码访问布局来填充布局。您给出的第一个示例是我首先尝试的,虽然我不完全确定我是怎么搞砸的。我想我是想把它作为“gridLayout”来访问,而不是作为“ui”的一员。非常感谢您的回复和澄清!这对我不起作用(第一个解决方案)。程序会编译,但不会显示小部件。有什么想法吗?