是否可以将宏函数作为 QMetaMethod 标记?
Is it possible to have a macro function as a QMetaMethod tag?
Qt allows you to have arbitrary tags 在 slots/Q_INVOKABLE 方法上使用此语法:
// 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_TAG(someData)
- 但是,MOC 给我这个错误:
error: Parse error at ")"
有没有办法让它工作?还是MOC只支持标签的简单宏?
tl;dr 是你可以做到这一点,但 moc 对它接受的内容很挑剔。
根据您链接的文档,Qt 5.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
,您应该在生成的字符串 table.[=13= 中找到 '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[=11=]test[=11=]qt"
};
您还可以按照链接文档中的说明使用 QMetaMethod::tag() 来测试是否成功。
我测试了其他几个宏,发现 moc 接受的内容很严格。例如,具有多个参数的宏以及包含括号或破折号的宏主体会导致错误。 moc 使用自己的预处理器实现,与 GNU C 预处理器相比可能会受到限制。
Qt allows you to have arbitrary tags 在 slots/Q_INVOKABLE 方法上使用此语法:
// 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_TAG(someData)
- 但是,MOC 给我这个错误:
error: Parse error at ")"
有没有办法让它工作?还是MOC只支持标签的简单宏?
tl;dr 是你可以做到这一点,但 moc 对它接受的内容很挑剔。
根据您链接的文档,Qt 5.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
,您应该在生成的字符串 table.[=13= 中找到 '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[=11=]test[=11=]qt"
};
您还可以按照链接文档中的说明使用 QMetaMethod::tag() 来测试是否成功。
我测试了其他几个宏,发现 moc 接受的内容很严格。例如,具有多个参数的宏以及包含括号或破折号的宏主体会导致错误。 moc 使用自己的预处理器实现,与 GNU C 预处理器相比可能会受到限制。