首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含c++宏的Q_OBJECT

包含c++宏的Q_OBJECT
EN

Stack Overflow用户
提问于 2016-12-09 09:20:35
回答 2查看 909关注 0票数 2

我正在开发一个有几个插件的c++/Qt程序。对于每个类,我必须定义一个插件接口,如下所示:

代码语言:javascript
复制
//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++预处理专家):

代码语言:javascript
复制
#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 ),我只需添加:

代码语言:javascript
复制
MY_PLUGIN(qwerty)

它将扩展(g++ -E的输出):

代码语言:javascript
复制
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";} };

它看上去还可以(很抱歉它的可读性,但我不知道如何添加换行符。)如果在我的代码中复制/粘贴上面的行,那么可以工作,但是..。

当我编译我的项目时,我从moc中得到错误

代码语言:javascript
复制
Error: Class declaration lacks Q_OBJECT macro.

有谁有主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-09 13:21:19

事实证明,正如@Silicomancer所建议的那样,你无法做到这一点。

我发现这个问题是多行宏,如果这个宏是一行的话,它确实有效:

代码语言:javascript
复制
#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;} };

在我看来,它看起来像是moc在文件中查找Q_OBJECT,但不处理宏

票数 1
EN

Stack Overflow用户

发布于 2022-11-17 15:46:03

有一个简单的替代解决方案。您可以像这样定义宏:

代码语言:javascript
复制
#define MY_MACRO(qobj, PARAM1, PARAM2, ETC)
...
... // (do your macro here, but don't use the first param, qobj)
...

当您在头文件中调用宏时,按如下方式调用它

MY_MACRO(Q_OBJECT, 1, 2, 3)

这将欺骗MOC在头文件上运行,因为它是哑的,只看到字符串Q_OBJECT。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41056941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档