2010-01-31 106 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,SIGNAL(readyToPrint()),ssobj1,SLOT(打印())) 扩展

回答

2

你会发现一些答案here

0

摸不着的最佳方式出去是download the source code并看看。

+0

我正在查看源代码@ http://qt.gitorious.org/qt/qt/trees/master/src/tools/moc – 2010-01-31 10:04:53