C++ 从代码访问在UI中创建的Qt布局?
这可能是我遇到过的最愚蠢的问题,但我非常困惑。我正在尝试开始布局,但由于某些原因,我无法理解这一点 我尝试通过.ui文件添加QGridLayout,只需将其拖放到我的项目中。由于我想在加载时用小部件填充网格,所以我尝试在调用this->setupui()之前/之后使用“mainwindow.h”文件中的“gridLayout”对象 由于我无法理解这一点,我选择使用代码从头开始创建它,并将以下内容添加到main.cpp文件中。这也没有显示,所以我想知道当表单加载时,我究竟如何填充网格C++ 从代码访问在UI中创建的Qt布局?,c++,qt,layout,widget,qt-creator,C++,Qt,Layout,Widget,Qt Creator,这可能是我遇到过的最愚蠢的问题,但我非常困惑。我正在尝试开始布局,但由于某些原因,我无法理解这一点 我尝试通过.ui文件添加QGridLayout,只需将其拖放到我的项目中。由于我想在加载时用小部件填充网格,所以我尝试在调用this->setupui()之前/之后使用“mainwindow.h”文件中的“gridLayout”对象 由于我无法理解这一点,我选择使用代码从头开始创建它,并将以下内容添加到main.cpp文件中。这也没有显示,所以我想知道当表单加载时,我究竟如何填充网格 #inclu
#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();
}
#包括
#包括
#包括“mainwindow.h”
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
主窗口w;
QGridLayout*grid=新的QGridLayout;
QLabel*label1=新的QLabel(“测试”);
QLabel*label2=新的QLabel(“测试2”);
grid->addWidget(标签1,0,0);
grid->addWidget(标签2,0,1);
w、 设置布局(网格);
w、 show();
返回app.exec();
}
假设您只需在主窗口中将QtDesigner中的QGridLayout设置为centralWidget,如下所示:
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();
}
您可以在主窗口代码中使用正确的对象名称访问它(这里是gridLayout):
如果您在QtDesigner或代码中设置了布局,并且希望更改布局,QWidget将不允许您安装另一个布局,您将收到如下错误消息:
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();
}
QWidget::setLayout:尝试在已具有布局的MainWindow“MainWindow”上设置QLayout“”
在这种情况下,您必须先删除现有布局,然后像上面的代码一样安装新布局
如果要访问主函数中的布局,可以通过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();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
QGridLayout*gridLayout=w.findChild(“gridLayout”);
Q_断言(网格布局);
gridLayout->addWidget(新的QLabel(“你好,第二个”);
w、 show();
返回a.exec();
}
到底是什么问题,您添加的小部件没有出现,还是出现在错误的位置?除非我通过UI编辑器添加它们,否则它们根本不会出现,在这种情况下,我似乎无法通过代码访问布局来填充布局。您给出的第一个示例是我首先尝试的,虽然我不完全确定我是怎么搞砸的。我想我是想把它作为“gridLayout”来访问,而不是作为“ui”的一员。非常感谢您的回复和澄清!这对我不起作用(第一个解决方案)。程序会编译,但不会显示小部件。有什么想法吗?