如何在Qt中使用宏定义信号
How to define signals with macros in Qt
我尝试为一些带有宏的类创建一些标准的信号定义,如:
#define CREATE_SIGNALS signals: void error_signal(QString error);
创建了函数,但是moc没有为这些函数创建方法。看起来moc是在处理宏之前运行的。我该怎么做呢?
Moc对它工作的源进行预处理,所以一旦你让宏定义了一些信号,而不是常规的方法,你的宏就会工作。
下面是一个完整的例子:
#include <QtCore>
#include <array>
#include <algorithm>
#define CREATE_SIGNALS
Q_SIGNAL void signal1(const QString & = QString());
Q_SIGNAL void signal2(int = 0);
struct Foo : QObject {
CREATE_SIGNALS
Q_OBJECT
};
struct Bar : QObject {
CREATE_SIGNALS
Q_OBJECT
};
int main()
{
std::array<int, 4> s;
Foo foo;
Bar bar;
s.fill(0);
QObject::connect(&foo, &Foo::signal1, [&]{++s[0];});
QObject::connect(&foo, &Foo::signal2, [&]{++s[1];});
QObject::connect(&bar, &Bar::signal1, [&]{++s[2];});
QObject::connect(&bar, &Bar::signal2, [&]{++s[3];});
emit foo.signal1();
emit foo.signal2();
emit bar.signal1();
emit bar.signal2();
Q_ASSERT(std::all_of(std::begin(s), std::end(s), [](int val) { return val == 1; }));
}
#include "main.moc"
相关文章:
- C++宏定义和取消定义
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 宏定义不正确没有错误
- Visual Studio:snprintf 冲突的宏定义
- 宏定义中的预处理器令牌两边有两个双引号
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 宏C++#定义示例(对象)(::f(s,(对象),arg1,arg2,arg3)
- 根据模板参数选择宏定义
- 使用宏定义打印格式参数
- 组合宏定义以一次获得多个定义 [avr C++]
- 如何在可执行文件中查看宏定义值
- 是否有另一种方法可以在不使用宏定义的情况下进行此操作
- 如何理解宏定义
- 坚持理解以下宏定义
- 发布C++宏定义
- 通过生成文件预处理器宏定义在 c++ 中无法正常工作
- 将预处理器宏定义为宏定义线
- GCC是否支持宏定义中的多行原始字符串文字
- 如何在Qt中使用宏定义信号