2016-12-09 110 views
1

我正在開發一個有多個插件的C++/Qt程序。 對於每個類我必須定義一個插件的界面,它看起來像這樣:包含Q_OBJECT的C++宏

//my class 
class qwerty; 

//my interface 
class qwertyPlug : public QObject, myPlug { 
Q_OBJECT 
Q_INTERFACES(nPanPlug) 
Q_PLUGIN_METADATA(IID "org.myapp.plug") 
public: 
    qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} 
    QByteArray name() {return "qwerty";} 
}; 

我創建了一個宏(實際上是2,因爲我不是一個C++預處理器大師):

#define MY_PLUGIN_BASE(__c_name,__appendix)         \ 
    class __c_name##__appendix : public QObject, myPlug {      \ 
    Q_OBJECT                 \ 
    Q_INTERFACES(nPanPlug)             \ 
    Q_PLUGIN_METADATA(IID "org.myapp.plug")         \ 
    public:                 \ 
     __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} \ 
     QByteArray name() {return #__c_name;}         \ 
    }; 

#define MY_PLUGIN(__c_name) MY_PLUGIN_BASE(__c_name,Plug) 

所以在我的代碼(其中qwerty定義),我只需要添加:

MY_PLUGIN(qwerty) 

這將擴大(的g++ -E輸出):

class qwertyPlug : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} QByteArray name() {return "qwerty";} }; 

,它看起來OK(遺憾的可讀性,但我不知道如何添加新行。)如果複製/粘貼上面的線在我的代碼,但工程...

當我編譯我的項目我得到的錯誤從moc

Error: Class declaration lacks Q_OBJECT macro. 

有沒有人有想法?

+0

什麼是myPlug? – Silicomancer

+0

這是插件接口,其中一個thah定義了'instantiate'並具有'Q_DECLARE_INTERFACE(myPlug,「org.myapp.plug」)' – bibi

回答

0

事實證明,正如@Silicomancer所建議的那樣,你不能這樣做。

我想通了,在proble是多行宏和它的作品確實如果宏是一個在線:

#define MY_PLUGIN_BASE(__c_name,__appendix) class __c_name##__appendix : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} QByteArray name() {return #__c_name;} }; 

對我來說,它看起來像建設部通過文件去尋找Q_OBJECT但沒有按與宏無關

+1

似乎moc可以很容易地被愚弄。不過我不確定你是否應該那樣做。如果你的代碼改變了,它可能會再次破壞。考慮放棄這種宏觀方法或找到自己的預處理方式。 – Silicomancer