首页 > 解决方案 > 访问布局对象 Qt 5

问题描述

我正在关注本书,它构建了某种 todo GUI 应用程序。我们首先创建一个MainWindow类:

// MainWindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>
#include <QVector>
#include "Task.hpp" // <- irrelevant to my question

namespace Ui {
    class MainWindow;
}

class MainWindow
    : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void add_task();

private:
    Ui::MainWindow *ui;       // <- this is what I am having problems with
    QVector<Task*> m_tasks_vec;
};

#endif // MAINWINDOW_HPP

在 UI 设计器中,我们添加了几个小部件,其中一个被称为tasks_layout

在此处输入图像描述

然后我们继续定义 的成员MainWindow

// MainWindow.cpp
#include "MainWindow.hpp"
#include "ui_MainWindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_tasks_vec()
{
    ui->setupUi(this);
    connect(ui->add_task_button, &QPushButton::clicked, this, &MainWindow::add_task);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::add_task()
{
    qDebug() << "User clicked on the button!";
    auto default_task_name = "Untitled task";
    auto *task = new Task(default_task_name);
    m_tasks_vec.append(task);
    ui->tasks_layout->addWidget(task); // problem here
}

ui->tasks_layout->addWidget(task);部分导致问题:

“Ui::MainWindow”中没有名为“tasks_layout”的成员

看上图,好像是tasks_layout嵌套在里面了centralWidget,所以我想可能是书上的错字,试了一下ui->centralWidget->tasks_layout->addWidget(task);,还是没有解决:

“QWidget”中没有名为“tasks_layout”的成员

我究竟做错了什么?

我发现的最接近我的问题的是这个,它对我没有帮助

这是自动生成的 ui_MainWindow.h:

/********************************************************************************
** Form generated from reading UI file 'MainWindow.ui'
**
** Created by: Qt User Interface Compiler version 5.12.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QLabel *status_label;
    QPushButton *add_task_button;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(420, 361);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        status_label = new QLabel(centralWidget);
        status_label->setObjectName(QString::fromUtf8("status_label"));
        status_label->setGeometry(QRect(10, 10, 111, 21));
        add_task_button = new QPushButton(centralWidget);
        add_task_button->setObjectName(QString::fromUtf8("add_task_button"));
        add_task_button->setGeometry(QRect(320, 10, 80, 21));
        MainWindow->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 420, 20));
        MainWindow->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QString::fromUtf8("statusBar"));
        MainWindow->setStatusBar(statusBar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", nullptr));
        status_label->setText(QApplication::translate("MainWindow", "Status: 0 todo / 0 done", nullptr));
        add_task_button->setText(QApplication::translate("MainWindow", "Add task", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

标签: c++qtqt5

解决方案


ui_MainWindow.h您的构建系统在更改之后没有更新MainWindow.ui,它也缺少垫片。您需要确保它重新运行uic

应该通过 QCreator 的构建操作来完成,但如果它变得混乱,您可能需要清理和/或重建。


推荐阅读