从代码访问在UI中创建的Qt布局? [英] Accessing Qt Layout created in UI from code?

查看:376
本文介绍了从代码访问在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:

您可以使用正确的对象名称(此处为gridLayout)以这种方式在MainWindow代码中对其进行访问:

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:尝试在已经具有布局的MainWindow"MainWindow"上设置QLayout"

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布局?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆