구성원 유형 포인터 유형에 대한 typedef를 선언하십시오.
해당 typedef에 대한 메타 형식을 선언하고 등록하십시오.
오직 typedef 만 사용하십시오. moc는 문자열 비교를 사용하여 유형 평등을 결정하며, C++ 유형 표현 파서는 없습니다.
예가 다음과 같습니다. a.exec()
이 호출되면 이벤트 대기열에 두 개의 QMetaCallEvent
이벤트가 있습니다. 첫 번째 것은 c.callSlot
이고, 두 번째 것은 a.quit
입니다. 그들은 순서대로 처형된다. 지연된 전화 (invokeMethod
또는 신호 활성화로 인한 것임)가 각 수신자에 대한 QMetaCallEvent
의 게시를 초래한다는 점을 상기하십시오.
#include <QCoreApplication>
#include <QDebug>
#include <QMetaObject>
class Class : public QObject {
Q_OBJECT
public:
typedef void (Class::*Method)(const QString &);
private:
void method(const QString & text) { qDebug() << text; }
Q_SLOT void callSlot(const QString & text, Class::Method method) {
(this->*method)(text);
}
Q_SIGNAL void callSignal(const QString & text, Class::Method method);
public:
Class() {
connect(this, SIGNAL(callSignal(QString,Class::Method)),
SLOT(callSlot(QString,Class::Method)),
Qt::QueuedConnection);
emit callSignal("Hello", &Class::method);
}
};
Q_DECLARE_METATYPE(Class::Method)
int main(int argc, char *argv[])
{
qRegisterMetaType<Class::Method>();
QCoreApplication a(argc, argv);
Class c;
QMetaObject::invokeMethod(&a, "quit", Qt::QueuedConnection);
return a.exec();
}
#include "main.moc"
왜 약간의 질문 : 포인터를 인수로 전달하고 싶습니까? –
어떤 오류가 발생합니까? 가능, 함수 포인터 유형에 대해 Q_DECLARE_METATYPE/qRegisterMetatype을 호출하는 것을 잊었습니까? –
[debug/moc_MainFrame.cpp] 오류 1. Q_DECLARE_METATYPE에 대해 들어 본 적이 없으므로 (보겠습니다). 나는이 함수의 선언을 public으로 선언 할 수 있다는 것을 알고 있지만, 그 에러 때문에 SLOT으로 사용할 수는 없다. QTcpServer를 사용하고 있고 응답을받을 때 다음 함수를 호출하는 포인터도 있습니다. – user3429997