Accessing Qt Layout created in UI from code?(从代码访问在 UI 中创建的 Qt 布局?)
问题描述
这可能是我遇到过的最愚蠢的问题,但我非常困惑.我正在尝试开始使用布局,但由于某种原因无法弄清楚这一点.
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.
我尝试通过 .ui 文件添加 QGridLayout,只需将其拖放到我的项目中即可.由于我想在加载时使用小部件填充网格,因此我尝试在调用 this->setupui() 之前/之后使用mainwindow.h"文件中的gridLayout"对象.
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.
由于我无法弄清楚,我选择尝试使用代码从头开始创建它,并将以下内容添加到 main.cpp 文件中.这也没有显示,所以我想知道如何在表单加载时填充网格.
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();
}
推荐答案
假设你已经简单地将 QtDesigner 中的 QGridLayout 设置为 MainWindow 中的 centralWidget,如下所示:
Assuming, you have simply set a QGridLayout in QtDesigner to your centralWidget in the MainWindow like this:
您可以在 MainWindow 代码中使用正确的对象名称访问它(这里是 gridLayout):
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);
}
如果您在 QtDesigner 或代码中设置了布局并且想要更改布局,QWidget 不会让您安装另一个布局,您将收到如下错误消息:
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 has a layout
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.
如果你想在你的主函数中访问布局,你可以通过 QObject::findChild 函数来实现,如下所示:
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();
}
这篇关于从代码访问在 UI 中创建的 Qt 布局?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从代码访问在 UI 中创建的 Qt 布局?


基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01