moc 中的宏扩展
我想使用 Q_CLASSINFO 宏存储一些类信息。但是我想将它包装在我自己的宏中,例如:
#define DB_TABLE( TABLE ) \
Q_CLASSINFO( "db_table", #TABLE )
#define DB_FIELD( PROPERTY, COLUMN ) \
Q_CLASSINFO( "dbcol_" #PROPERTY, #COLUMN )
class Foo : public QObject
{
Q_OBJECT
DB_TABLE( some_table )
DB_FIELD( clientName, client_name )
}
不幸的是,moc 不会扩展宏,因此不会添加 Q_CLASSINFO。
我尝试为 moc 提供已预处理的源代码,但它在某些包含的 Qt 类上失败。
您知道有什么解决方法吗?
I'd like to store some class info using Q_CLASSINFO macro. However I would like to wrap it in my own macro, for example:
#define DB_TABLE( TABLE ) \
Q_CLASSINFO( "db_table", #TABLE )
#define DB_FIELD( PROPERTY, COLUMN ) \
Q_CLASSINFO( "dbcol_" #PROPERTY, #COLUMN )
class Foo : public QObject
{
Q_OBJECT
DB_TABLE( some_table )
DB_FIELD( clientName, client_name )
}
Unfortunately, moc doesn't expand macros so the Q_CLASSINFO is not added.
I've tried to feed moc with already preprocessed source, but it failes on some included Qt classes.
Do you know any workaround for this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
实现这一点的简单方法是修改 moc 预处理器。
搜索行:
编译新的源代码。 moc可执行文件生成到/bin文件夹(如果使用windows查看c:/bin/moc.exe)
转到Qt bin (C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin ) 文件夹并重命名 moc 可执行文件,例如 moc.exe.bak
将新的 moc 可执行文件复制到 Qt bin 文件夹。
在您当前的应用程序中,您需要创建一个宏,例如:
<前><代码>#ifndef Q_MOC_RUN
#define DB_FIELD( 属性, 列 )
#endif
//或者就我而言
#ifndef Q_MOC_RUN
#define Q_SERVICE_INFO(方法、路径、类型)
#endif
最后我给你我自己的函数replaceCustomMacros的源代码:
这个函数转换Q_SERVICE_INFO(method, path, type) 宏到 Q_CLASSINFO("srv://method", "type:path")
我在互联网上没有找到任何具体的解决方案,然后我发布了这个解决方案。
祝你好运 :)
The easy way to make that is modifing moc preprocessor.
Search the line:
Compile the new source code. The moc executable file is generated to /bin folder (if you use windows look at c:/bin/moc.exe)
Go to Qt bin (C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin) folder and rename moc executable file e.g. moc.exe.bak
Copy new moc executable file to Qt bin folder.
In your current app you need to create a Macro for example:
Finally I let you my own source code of function replaceCustomMacros:
This function convert Q_SERVICE_INFO(method, path, type) macro to Q_CLASSINFO("srv://method", "type:path")
I have not found any specific solution on Internet then I have posted this solution.
Good Luck :)
除了滚动您自己的 pre-moc 预处理器之外,没有。例如,这就是 MeeGo Touch 所做的事情。既然诺基亚自己都在这么做,我相信也没有其他办法了。
在你的情况下,它只涉及将你自己的声明翻译成 Q_CLASSINFO,所以它应该不会太难。如果您使用 qmake,它也可以添加到构建序列中。
Other than rolling your own pre-moc preprocessor, no. That is what MeeGo Touch does, for example. Since Nokia themselves are doing it, I believe there is no other way.
In your case, it would only involve translating your own declarations into Q_CLASSINFO, so it shouldn't be too hard. If you use qmake, it can be added to the build sequence, too.