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

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

Я попытался добавить 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();
}

19

Решение

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

введите описание изображения здесь

Вы можете получить к нему доступ в своем коде 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();
}
25

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]