2016-12-09 161 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