Accessing Qt Layout created in UI from code?

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

Answers


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

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

Need Your Help

Is there a downside to declaring variables with auto in C++?

c++ c++11 type-inference auto

It seems that auto was a fairly significant feature to be added in C++11 that seems to follow a lot of the newer languages. As with a language like Python, I have not seen any explicit variable

how to load view into another view codeigniter 2.1?

codeigniter view load

Ive been working with CI and I saw on the website of CI you can load a view as a variable part of the data you send to the "main" view, so, according the site (that says a lot of things, and many a...