C++ 是否可以将宏函数作为QMetaMethod标记?
在slot/Q_上使用以下语法的可调用方法:C++ 是否可以将宏函数作为QMetaMethod标记?,c++,qt,signals-slots,qmetaobject,C++,Qt,Signals Slots,Qmetaobject,在slot/Q_上使用以下语法的可调用方法: // In the class MainWindow declaration #ifndef Q_MOC_RUN // define the tag text as empty, so the compiler doesn't see it # define MY_CUSTOM_TAG #endif ... private slots: MY_CUSTOM_TAG void testFunc(); 我想制作一个宏函数标记,如下所示: #i
// In the class MainWindow declaration
#ifndef Q_MOC_RUN
// define the tag text as empty, so the compiler doesn't see it
# define MY_CUSTOM_TAG
#endif
...
private slots:
MY_CUSTOM_TAG void testFunc();
我想制作一个宏函数标记,如下所示:
#ifndef Q_MOC_RUN
# define MY_CUSTOM_TAG(...)
#endif
...
private slots:
MY_CUSTOM_TAG(someData) void testFunc();
我希望它会在tag()
中以字符串形式结束,就像MY_CUSTOM\u标记(someData)
一样,我的代码将对其进行解析-但是,MOC给了我以下错误:
error: Parse error at ")"
有没有办法让这一切顺利进行?还是MOC只支持标签的简单宏?tl;dr认为您可以这样做,但moc对其接受的内容很挑剔 根据您链接的文档,Qt5.0+中的moc将扩展预处理器宏。您可以通过以下示例确认这一点:
#ifndef Q_MOC_RUN
#define MY_TAG(...)
#else
#define MY_TAG(x) x
#endif
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QObject *parent = 0);
public slots:
MY_TAG(qt) void test();
};
如果检查moc生成的moc_test.cpp
,则应在生成的字符串表中找到“qt”
static const qt_meta_stringdata_Test_t qt_meta_stringdata_Test = {
{
QT_MOC_LITERAL(0, 0, 4), // "Test"
QT_MOC_LITERAL(1, 5, 4), // "test"
QT_MOC_LITERAL(2, 10, 2) // "qt"
},
"Test\0test\0qt"
};
您还可以使用链接文档中描述的QMetaMethod::tag()测试成功
我测试了其他几个宏,发现moc在其可接受的方面是严格的。例如,具有多个参数的宏和包含括号或破折号的宏体会导致错误。moc使用自己的预处理器实现,与GNU C预处理器相比,它可能受到限制。对不起,我应该在moc步骤中指定它。我担心答案会是否定的,但我想我会看看是否有人想出了一个解决办法或一种不同的方式来做我想做的事情。你想做什么?
MY_CUSTOM_TAG_somedata_适当地编码有什么问题
?标记毕竟只是一个C字符串。我正在使用metaobject系统向脚本引擎公开各种函数。我有一个EXPORT
宏,所以只暴露了某些插槽,我想看看是否有可能使EXPORT\u RENAME(name)
宏能够为脚本引擎中的函数使用不同的名称@walkingTarget帮助我找到了一种方法,通过在define中设置一个我没有想到的else
案例,它至少可以像MY\u CUSTOM\u TAG\u somedata\u适当地\u encode>,所以这非常有用!美好的生成的标记字符串似乎必须是一个以空格分隔的有效符号名列表。因此,在生成的标记中,括号内没有数字(没有下划线/字母前缀)、运算符和空格被缩减为单个空格。但是,嵌套宏可以工作,这意味着例如MY\u标记(另一个\u宏)
将展开另一个\u宏
(该宏仍必须展开为仅有效的符号名称),并将其放入标记字符串中。谢谢,这让我可以输入任意字符串作为标记,而无需每次定义一个新的宏,因此这绝对是一个好的解决方案!