c++ - 访问布局对象 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
解决方案
ui_MainWindow.h
您的构建系统在更改之后没有更新MainWindow.ui
,它也缺少垫片。您需要确保它重新运行uic
。
这应该通过 QCreator 的构建操作来完成,但如果它变得混乱,您可能需要清理和/或重建。
推荐阅读
- tabulator - 更新bottomCalc-value,基于选择(如果有的话)
- sql - INTERSECT ALL 不适用于 PostgreSQL 11
- c# - 为什么我不能从 linq 语句中的选择中删除列/道具
- android - Viewpager 中的片段在重新访问时不显示
- python-3.x - 将大量图像从内存流到 Keras 生成器
- wpf - 根据命令的 CanExecute 禁用文本框
- apache-kafka - 使用 STRUCT 类型的 KSQL 是否支持在 JSON 中定义的嵌套对象?
- java - 添加列表
朋友 = 新的 ArrayList<>(); 自定义列表视图 - sql - SQL 函数 - 使用 Levenshtein 距离算法进行模糊匹配 - 仅返回最小值
- javascript - 在javascript中展平json数组