Подтвердить что ты не робот

Доступ к макету Qt, созданному в пользовательском интерфейсе, из кода?

Это, наверное, самая тупая проблема, которую я когда-либо имел, но я очень смущен. Я пытаюсь начать работу с макетами, но по какой-то причине не могу понять этого.

Я попытался добавить QGridLayout через .ui файл, просто перетащив его в свой проект. Поскольку я хочу заполнить сетку виджетами при загрузке, я попытался использовать объект "gridLayout" в файле "mainwindow.h" как до, так и после вызова 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();
}
4b9b3361

Ответ 1

Предполагая, что вы просто установили QGridLayout в QtDesigner в ваш центральный виджет в MainWindow следующим образом:

enter image description here

вы можете получить к нему доступ в своем коде MainWindow таким образом с правильным именем объекта (здесь это gridLayout):

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: попытка установить QLayout "на MainWindow" MainWindow", у которого уже есть макет

В этом случае сначала необходимо удалить существующий макет, а затем установить новый, как в приведенном выше коде.

Если вы хотите получить доступ к макету в своей основной функции, вы можете добиться этого с помощью функции 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();
}