从代码中访问在UI中创建的QT布局?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

我尝试通过.ui文件添加一个QGridLayout,只需将它拖放到我的项目中即可。由于我希望在加载时使用小部件填充网格,因此在调用this->setupui(),之前/之后,我尝试在“mainwindow.h”文件中使用“gridLayout”对象。

我选择使用代码从头开始创建它,然后将以下内容添加到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();
}
提问于
用户回答回答于

假设您只是在QtDesigner中将QGridLayout设置为MainWindow中的集中式Widget,如下所示:

您可以使用正确的对象名(此处为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: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

在这种情况下,您必须首先删除现有的布局,然后安装新的布局,如上面的代码所示。

如果您想访问主函数中的布局,可以通过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();
}

扫码关注云+社区