如何在Qt中使用宏定义信号

How to define signals with macros in Qt

本文关键字:宏定义 信号 Qt      更新时间:2023-10-16

我尝试为一些带有宏的类创建一些标准的信号定义,如:

#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"