【问题标题】:How to define signals with macros in Qt如何在 Qt 中使用宏定义信号
【发布时间】:2016-06-29 18:20:42
【问题描述】:

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

#define CREATE_SIGNALS signals: void error_signal(QString error);

创建了函数,但 moc 没有为这些函数创建方法。似乎 moc 在宏处理之前运行。我怎样才能做到这一点?

【问题讨论】:

  • 你可能无法做你想做的事(并使用moc)。请编辑您的问题以给出实际的真实案例并激励您的问题。

标签: c++ qt c++11 c-preprocessor moc


【解决方案1】:

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"

【讨论】:

  • 实际上,我将宏写为#define CREATE_SIGNALS 信号: void error_signal(QString error);它不工作,但在 Q_SIGNAL 之后它现在工作了。
  • @fyo Q_SIGNAL 和 Q_SLOT 保证在所有情况下都能正常工作。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多