2010-11-21 48 views
10

在我的申請,我有下面的類層次結構:是否可以將模板派生的C++類與Qt的Q_OBJECT混合?

class Word 
{ 
    ... 
} 

template <typename T> class Dictionary 
{ 
    ... 
}; 

class WordDictionary : public Dictionary<Word> 
{ 
    Q_OBJECT 

    ... 
} 

的WordDictionary類解析字典這需要很長的時間。我正在一個單獨的線程中運行解析函數,我希望它能夠不時地發出GUI線程的信號,以便根據正在解析的當前行號提供進度更新。這就是爲什麼我希望它是一個Q_OBJECT。我試圖讓基類Dictionary爲Q_OBJECT,但得到了一條消息,說明Q_OBJECT模板不受支持。當我刪除了宏觀,只留下WordDictionary爲Q_OBJECT,我得到了一堆的一般形式的錯誤消息:

\ GeneratedFiles \發佈\ moc_dictionary.cpp(44):錯誤C2039: 'staticMetaObject':是不是「詞典」
與成員
[
T =字
]

有什麼我可以做,使我的模板衍生WordDictionary類比硬編碼模板功能以外的Q_OBJECT在這邊,產生了很多樣板代碼?

編輯:更改模板聲明:

template <typename T> class Dictionary : public QObject 

使代碼編譯。不過,我不確定我是不是在做一些愚蠢的事情,如果這能夠正常工作的話。

+0

[爲什麼Qt沒有爲信號和插槽使用模板](http://qt-project.org/doc/qt-4.8/templates.html) – 2012-09-28 11:45:06

回答

14

你不能直接這樣做,但有可用的工作輪。請參閱文章here

雖然在理論上是可能的 MOC處理模板,這將是 極其複雜的實現,並 將是非常不切實際的使用: 對於每個模板實例,MOC 必須產生適當的 元對象代碼,並且將所生成的代碼 將必須包含一次 每鏈接單元---成爲一 惡夢保持一旦模板 類用於與不同的編譯 同一模板 參數 單位。

如果信號和槽不需要 模板參數是 原型部分,解決辦法是讓 模板類繼承 QObject的子類,它提供了所需的 信號和槽。如果 信號和插槽需要使用 模板參數,則可以使用Observer 模式。

2

我只是嘗試這樣的代碼,它編譯並運行正常:

#include <QtCore/QCoreApplication> 
#include <QObject> 

class Word 
{ 

}; 

template <typename T> class Dictionary 
{ 

}; 

class WordDictionary : public Dictionary<Word>, QObject 
{ 
    Q_OBJECT 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    WordDictionary wd(); 
    return a.exec(); 
} 

可能是我想的東西?

+0

這可能會產生問題,查看文章我引用了一個討論。 – 2010-11-21 14:08:07

+0

@Steve:下線有什麼問題?引用的文章只討論試圖從QObject派生類模板。這是從模板實例和QObject派生一個類。我看到的唯一問題是,QObject應該是繼承列表中的第一個,因爲moc假定第一個繼承的類是QObject的子類。 – baysmith 2010-11-22 00:48:22

+3

QObject不應該成爲第一個基類嗎? – zarzych 2010-11-22 13:02:09