2011-12-09 78 views
0

首先,我发布了很多搜索,阅读和调试后的问题......但无法解决问题。Qt - 错误:ISO C++禁止声明'MainWindow'没有类型

我有两个类MainWindow和Controller,他们都需要包含其他。我试图解决使用转发的递归问题,但它不起作用。 我想我用命名空间实现forward有一些问题。

两个类中的代码:(我试图缩短代码长度,尽可能地)

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QtCore> 
#include "controller.h" 


namespace Ui { 
    class MainWindow; 
} 


class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void addRadioButtons(); 
    void changeViewQML(QString); 
    void changeViewXML(QString); 

private: 
    Ui::MainWindow *ui; 
    controller controllerObj; 
}; 

#endif // MAINWINDOW_H 

或者Controller.h

#ifndef CONTROLLER_H 
#define CONTROLLER_H 

#include <QtCore> 
#include "mainwindow.h" 


class controller : public QThread 
{ 
public: 
    controller(); 
    void response_handler(QString); 

private: 
    MainWindow *viewObj; 

protected: 
    void run(); 

}; 

#endif // CONTROLLER_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

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

void MainWindow::changeViewQML(QString s) 
{ 
    qDebug(s.toAscii()); 
} 

controller.cpp

#include "controller.h" 

controller::controller() 
{ 
} 

void controller::response_handler(QString responseFilePath) 
{ 
    viewObj->changeViewQML(responseFilePath); 
} 

和我保持有这个ISO错误。

遗憾的长码,如果任何部分是不够的

回答

0

明确的只是向前声明MainWindow。在或者Controller.h

更换 #include "mainwindow.h"

namespace Ui { 
    class MainWindow; 
} 

也称其为Ui::MainWindow *viewObj;或在您或者Controller.h写using namespace Ui

编辑

此编译罚款:

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QtCore> 
#include "controller.h" 

namespace Ui{ 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void addRadioButtons(); 
    void changeViewQML(QString); 
    void changeViewXML(QString); 

private: 
    Ui::MainWindow *ui; 
    controller controllerObj; 
}; 

#endif // MAINWINDOW_H 

或者Controller.h

#ifndef CONTROLLER_H 
#define CONTROLLER_H 

#include <QtCore> 
//#include "mainwindow.h" 
class MainWindow; 


class controller : public QThread 
{ 
public: 
    controller(); 
    void response_handler(QString); 

private: 
    MainWindow *viewObj; 

protected: 
    void run(); 

}; 

#endif // CONTROLLER_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

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

void MainWindow::changeViewQML(QString s) 
{ 
    qDebug(s.toAscii()); 
} 

controller.cpp

#include "controller.h" 
#include "mainwindow.h" 

controller::controller() 
{ 
} 

void controller::run() 
{ 
} 

void controller::response_handler(QString responseFilePath) 
{ 
    viewObj->changeViewQML(responseFilePath); 
} 
+0

我试过这之前,它给了我错误:使用不完整的类型'struct Ui :: MainWindow'...我试图解决这个新的错误我的#include“mainwindow.h”在controller.cpp文件中但它不工作! –

+0

好吧,对不起,我对'MainWindow'和'Ui :: MainWindow'是2个不同的类的事实感到困惑,我打算用一个工作示例编辑我的答案 – PeterT

+0

当我尝试你的解决方案时,我发现文件mainview.cpp包含的“ui_mainwindow.h”具有以下代码:namespace Ui {MainWindow:public Ui_MainWindow {};}} } //命名空间Ui ....顺便说一下,mainview类是由QtCreator自动生成的 –

相关问题