Accessing Qt Layout created in UI from code?

2020-06-01 06:19发布

This is probably the dumbest problem I have ever had, but I am extremely confused. I am trying to get started with layouts, but for some reason cannot figure this one out.

I have tried adding a QGridLayout via the .ui file by just drag dropping it into my project. As I want to populate the grid with widgets upon loading, I have tried to use the "gridLayout" object in the "mainwindow.h" file both before/after the this->setupui() is called.

As I couldn't figure that out, I opted to just try creating it from scratch using code, and added the following to the main.cpp file instead. This did not display either, so I am wondering how on earth I can populate the grid when the form loads.

#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();
}

1条回答
Melony?
2楼-- · 2020-06-01 06:47

Assuming, you have simply set a QGridLayout in QtDesigner to your centralWidget in the MainWindow like this:

enter image description here

you can access it in your MainWindow code in that way with the correct object name (here it is gridLayout):

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

If you have set a layout in QtDesigner or in code and you want to change the layout, QWidget won't let you install another one and you will get an error message like this:

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

In this case you have to delete the existing layout at first and then install the new one like in your code above.

If you want to access the layout in your main function you can achieve this by the QObject::findChild function like this:

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();
}
查看更多
登录 后发表回答