虽然这是一个经常被问到的问题,我已经尝试了很多方法,包括SO的方法,比如尝试从另一个类访问MainWindow的小部件,但我仍然无法找到解决方案,下面是我报告错误的代码"未知的类型名称"CustomClass"在mainwindow.h
中:提前感谢您的帮助!
customclass.h
#ifndef CUSTOMCLASS_H
#define CUSTOMCLASS_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
class MainWindow;
class CustomClass
{
public:
CustomClass(MainWindow *parent);
MainWindow * mainWindow;
void testFunc();
};
#endif // CUSTOMCLASS_H
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "customclass.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
Ui::MainWindow *ui;
CustomClass *customClass = new CustomClass(this);
};
#endif // MAINWINDOW_H
customclass.cpp
#include "customclass.h"
CustomClass::CustomClass(MainWindow *parent)
{
this->mainWindow = parent;
}
void CustomClass::testFunc()
{
mainWindow->ui->label->setText("Hello World!");
}
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
customClass->testFunc();
}
MainWindow::~MainWindow()
{
delete ui;
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
请阅读C++中的循环依赖关系。
您有问题,因为您创建了一个循环,您在MainWindow类中包含了#include "customclass.h"
,在CustomClass中也包含了#include "mainwindow.h"
。
最好不要在其他类中使用MainWindow,而是在MainWindow中添加CustomClass对象。这个想法是MainWindow是你的根窗口类,我们在main.cpp
中从它创建一个对象,你可以按照你的要求做,但从逻辑上讲,这并不好。
正如我们在QMainWindow类文档中看到的那样。
QMainWindow类提供主应用程序窗口
主窗口提供了用于构建应用程序用户的框架界面
这是你的基础,你应该在这个类中添加你想要的功能,而不是在其他小部件中添加。它是其他小部件的主要类。这是一种干净的编码方式,如果你在GitHub中查看大型项目,你会看到这一点。
将customclass.h
中的#include "mainwindow.h"
和#include "ui_mainwindow.h"
移动到#include "customclass.h"
之前的customclass.cpp
中,就可以了!谢谢@drescherjm
固定代码如下所示:
customclass.h
#ifndef CUSTOMCLASS_H
#define CUSTOMCLASS_H
class MainWindow;
class CustomClass
{
public:
CustomClass(MainWindow *parent);
~CustomClass();
MainWindow *mainWindow;
void testFunc();
};
#endif // CUSTOMCLASS_H
customclass.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"//Move these two lines from the header to here
#include "customclass.h"
CustomClass::CustomClass(MainWindow *parent)
{
this->mainWindow = parent;
}
CustomClass::~CustomClass()
{
}
void CustomClass::testFunc()
{
mainWindow->ui->label->setText("Hello World!");
}