gpt4 book ai didi

c++ - 访问布局对象 Qt 5

转载 作者:行者123 更新时间:2023-11-28 04:21:55 25 4
gpt4 key购买 nike

我正在关注 this书,它构建了某种待办事项 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:

enter image description here

然后我们继续定义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);部分导致问题:

no member named 'tasks_layout' in 'Ui::MainWindow'

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

no member named 'tasks_layout' in 'QWidget'

我做错了什么?

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

这是自动生成的 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

最佳答案

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

应该由 QCreator 的构建操作完成,但如果它变得困惑,您可能需要清理和/或重建。

关于c++ - 访问布局对象 Qt 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com