2014-03-24 5 views
4

현재 Qt 프로젝트에서 작업 중이며 SLOT에 문제가 있습니다. 구성원 함수에 대한 포인터를 SLOT의 인수로 전달하려고합니다. 이렇게하려면 클래스에 SLOT을 선언했지만 그렇게하면 MOC 오류가 발생합니다. 내가 달성하고 싶은 것이 가능할 지 모르겠다.QT SLOT : 구성원 함수 오류에 대한 포인터 오류

라는 클래스 메인 프레임을위한 구문의 exemple은 :

void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString)); 

나는 어떤 그 기능을 사용하여 어디서든 아무것도 연결하지가없는, 내가 가지고있는 유일한 오류가 이상이 라인에 있습니다.

도움을 주신 모든 분들께 감사드립니다. 나는 웹상에서 어떤 해결책을 찾을 수 없다. (누군가이 관심이 있다면 SIGNAL and SLOT in depth을 설명하는이 기사를 찾았다.)

+0

왜 약간의 질문 : 포인터를 인수로 전달하고 싶습니까? –

+0

어떤 오류가 발생합니까? 가능, 함수 포인터 유형에 대해 Q_DECLARE_METATYPE/qRegisterMetatype을 호출하는 것을 잊었습니까? –

+0

[debug/moc_MainFrame.cpp] 오류 1. Q_DECLARE_METATYPE에 대해 들어 본 적이 없으므로 (보겠습니다). 나는이 함수의 선언을 public으로 선언 할 수 있다는 것을 알고 있지만, 그 에러 때문에 SLOT으로 사용할 수는 없다. QTcpServer를 사용하고 있고 응답을받을 때 다음 함수를 호출하는 포인터도 있습니다. – user3429997

답변

7
  1. 구성원 유형 포인터 유형에 대한 typedef를 선언하십시오.

  2. 해당 typedef에 대한 메타 형식을 선언하고 등록하십시오.

  3. 오직 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"