Вероятно, это самая глупая проблема, с которой я когда-либо сталкивался, но я очень растерялся. Я пытаюсь начать с макетов, но по какой-то причине не могу понять это.
Я попытался добавить 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();
}
Предполагая, что вы просто установили 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();
}
Других решений пока нет …