2011-07-07 66 views
0

我想創建視圖並通過構造函數將它傳遞給控制器​​。qt中的MVC和接口問題

所以,我創建的接口:

#include <QString> 

class IMainView 
{ 
public: 
    virtual ~IMainView() {} 
    virtual void setWindowTitle1(QString &title) = 0; 
}; 

Q_DECLARE_INTERFACE(IMainView, "IMainView/1.0"); 

然後我創建的視圖:從IMainView

class MainWindow : public QMainWindow, IMainView 
{ 
    Q_OBJECT 
    Q_INTERFACES(IMainView) 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

    void setWindowTitle1(QString &title); 

private: 
    Ui::MainWindow *ui; 
}; 

主窗口。 現在我必須要通過IMainView到控制器的情況下,因爲每個控制器寄存器觀點:

#include "maincontroller.h" 


MainController::MainController(IMainView *v) 
{ 
    QString title = "my application"; 
    v->setWindowTitle1(title); 
} 

MainController::MainController() 
{ 
} 

而且我得到了錯誤: E:\時\分\ mainapplication \ IMainView.h:13:錯誤:C2259: 'IMainView': '無效IMainView :: setWindowTitle1(QString的&)':不能因下列成員實例化抽象類 是抽象

在C#中它的工作原理,但在QT沒有。

感謝


對不起,錯誤的問題。問題是與接口,這是抽象類(iMainView.h):

#include <QString> 

class IMainView 
{ 
public: 
    virtual ~IMainView() {} 
    virtual void setWindowTitle1(QString &title) = 0; 
}; 

Q_DECLARE_INTERFACE(IMainView, "IMainView/1.0"); 

和這個類已被附接到主窗口頭文件(mainwindow.h):

#ifndef MAINCONTROLLER_H 
#define MAINCONTROLLER_H 

#include "IMainView.h" //here is error 


class MainController 
{ 
public: 
    //MainController(IMainView *v); 
    MainController(); 


}; 

#endif // MAINCONTROLLER_H 

和我錯誤:

E:\時\時\ mainapplication \ IMainView.h:13:錯誤:C2259: 'IMainView':不能實例抽象類 由於以下成員: 「空隙IMainView :: setWindowTitle1(即QString &) ':是abs道

感謝

+0

哪一行是它所抱怨的第13行。 –

+0

某處,您正在聲明或試圖實例化一個不允許的純IMainView實例。如果它不在您的代碼中,您可以嘗試仔細檢查由Q_DECLARE_INTERFACE宏生成的預處理代碼。 –

回答

0

你需要在課堂主窗口,你可能錯過了實現setWindowTitle1。這是簡單的C++,並不是Qt特有的。

+0

好吧,我知道這不是Qt,而是C++。函數setWindowTitle1在mainwindow.cpp中實現。 當我在maincontroller頭類中調用#include「IMainView.h」時發生錯誤。 – Robert

+0

爲什麼接受這個答案呢?問題似乎沒有解決...我有同樣的問題,一切都按照它應該實現的:/ – MOnsDaR

0

一定要

> #include <QObject> 

某處上方的接口聲明。 QObject.h包含Q_DECLARE_INTERFACE及其依賴項的定義。