에서 매크로 신호를 정의하는 방법은 같은 매크로 일부 클래스 definitionsfor, 일부의 standart 신호를 만들려고 :Qt는
#define CREATE_SIGNALS signals: void error_signal(QString error);
기능이 생성되지만, MOC는 이러한 기능을위한 방법을 작성하지 않았다. 매크로가 처리되기 전에 moc가 실행중인 것처럼 보입니다. 이 작품을 어떻게 만들 수 있습니까?
에서 매크로 신호를 정의하는 방법은 같은 매크로 일부 클래스 definitionsfor, 일부의 standart 신호를 만들려고 :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"
사실, #define CREATE_SIGNALS 신호로 매크로를 작성했습니다 : void error_signal (QString error); 작동하지 않았지만 Q_SIGNAL 이후에는 현재 작동 중입니다. – fyo
@fyo Q_SIGNAL 및 Q_SLOT은 모든 경우에 사용할 수 있습니다. –
당신은 아마 당신이 원하는 일을 (그리고'moc' 사용) 할 수 없습니다
다음 완벽한 예입니다. ** 귀하의 질문을 ** 실제 실제 사례를 제공하고 * 귀하의 질문에 동기를 부여하기 위해 ** 수정하십시오. –