2010-01-31 2 views
0

Qt가 Qt에서 신호 슬롯 메커니즘을 제공 할 수있는 메타 오브젝트 컴파일을 구현하는 방법을 알고 싶습니다. 문서에서 자세한 내용을 찾을 수 없습니다.QMetaObject 컴파일러 설명?

편집 : 나는 다음 _id = QObject::qt_metacall(_c, _id, _a);

의 소스 코드를 얻을 수 없습니다 생각하는 것은 소스 파일 및 MOC 파일을 해당합니다. 또한

#ifndef SSOBJECT_H 
#define SSOBJECT_H 

#include <QObject> 

class ssObject : public QObject 
{ 
Q_OBJECT 
public: 
    explicit ssObject(QObject *parent = 0); 

signals: 
    void readyToPrint(); 
    void readyToPrint1(int); 
    void readyToPrint2(float); 

private slots: 
    int print(); 

}; 

#endif // SSOBJECT_H 

//output from MOC 
#include "../ssobject.h" 
#if !defined(Q_MOC_OUTPUT_REVISION) 
#error "The header file 'ssobject.h' doesn't include <QObject>." 
#elif Q_MOC_OUTPUT_REVISION != 62 
#error "This file was generated using the moc from 4.6.1. It" 
#error "cannot be used with the include files from this version of Qt." 
#error "(The moc has changed too much.)" 
#endif 

QT_BEGIN_MOC_NAMESPACE 
static const uint qt_meta_data_ssObject[] = { 

// content: 
     4,  // revision 
     0,  // classname 
     0, 0, // classinfo 
     4, 14, // methods 
     0, 0, // properties 
     0, 0, // enums/sets 
     0, 0, // constructors 
     0,  // flags 
     3,  // signalCount 

// signals: signature, parameters, type, tag, flags 
     10, 9, 9, 9, 0x05, 
     25, 9, 9, 9, 0x05, 
     44, 9, 9, 9, 0x05, 

// slots: signature, parameters, type, tag, flags 
     69, 9, 65, 9, 0x08, 

     0  // eod 
}; 

static const char qt_meta_stringdata_ssObject[] = { 
    "ssObject\0\0readyToPrint()\0readyToPrint1(int)\0" 
    "readyToPrint2(float)\0int\0print()\0" 
}; 

const QMetaObject ssObject::staticMetaObject = { 
    { &QObject::staticMetaObject, qt_meta_stringdata_ssObject, 
     qt_meta_data_ssObject, 0 } 
}; 

#ifdef Q_NO_DATA_RELOCATION 
const QMetaObject &ssObject::getStaticMetaObject() { return staticMetaObject; } 
#endif //Q_NO_DATA_RELOCATION 

const QMetaObject *ssObject::metaObject() const 
{ 
    return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; 
} 

void *ssObject::qt_metacast(const char *_clname) 
{ 
    if (!_clname) return 0; 
    if (!strcmp(_clname, qt_meta_stringdata_ssObject)) 
     return static_cast<void*>(const_cast< ssObject*>(this)); 
    return QObject::qt_metacast(_clname); 
} 

int ssObject::qt_metacall(QMetaObject::Call _c, int _id, void **_a) 
{ 
    _id = QObject::qt_metacall(_c, _id, _a); 
    if (_id < 0) 
     return _id; 
    if (_c == QMetaObject::InvokeMetaMethod) { 
     switch (_id) { 
     case 0: readyToPrint(); break; 
     case 1: readyToPrint1((*reinterpret_cast< int(*)>(_a[1]))); break; 
     case 2: readyToPrint2((*reinterpret_cast< float(*)>(_a[1]))); break; 
     case 3: { int _r = print(); 
      if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; 
     default: ; 
     } 
     _id -= 4; 
    } 
    return _id; 
} 

// SIGNAL 0 
void ssObject::readyToPrint() 
{ 
    QMetaObject::activate(this, &staticMetaObject, 0, 0); 
} 

// SIGNAL 1 
void ssObject::readyToPrint1(int _t1) 
{ 
    void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; 
    QMetaObject::activate(this, &staticMetaObject, 1, _a); 
} 

// SIGNAL 2 
void ssObject::readyToPrint2(float _t1) 
{ 
    void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; 
    QMetaObject::activate(this, &staticMetaObject, 2, _a); 
} 
QT_END_MOC_NAMESPACE 

QObject를이 :: 연결하는 방법을 설명 (ssobj1를, 신호 (readyToPrint는()), ssobj1, SLOT (인쇄())) 는

답변

2

일부 답변은 here입니다.

0

이를 파악하는 가장 좋은 방법은 확장 밖으로는 download the source code에 있고 모양이있다.

+0

@ http://qt.gitorious.org/qt/qt/trees/master/src/tools/moc 소스 코드를 살펴 보았습니다. –