2010-02-11 5 views
0

Я ищу реализацию Qt функции QObject::qt_metacall(_c, _id, _a);, где данное имя функции преобразуется в индекс. Но я не могу найти реализацию функции в любом месте исходного кода.Что делает следующая функция?

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; 
       //'''' 

     } 
    return _id; 
    } 

Почему называются родительский класс qt_metacall?

ответ

3

У вас должно быть где-то найти moc_qobject.cpp. Он требует, чтобы вы построили Qt, поскольку этот файл автоматически генерируется, как и ваши собственные файлы moc.

Здесь из моей сборки (4.6.1 на окнах):

int QObject::qt_metacall(QMetaObject::Call _c, int _id, void **_a) 
{ 
    if (_id < 0) 
     return _id; 
    if (_c == QMetaObject::InvokeMetaMethod) { 
     switch (_id) { 
     case 0: destroyed((*reinterpret_cast< QObject*(*)>(_a[1]))); break; 
     case 1: destroyed(); break; 
     case 2: deleteLater(); break; 
     case 3: d_func()->_q_reregisterTimers((*reinterpret_cast< void*(*)>(_a[1]))); break; 
     default: ; 
     } 
     _id -= 4; 
    } 
#ifndef QT_NO_PROPERTIES 
     else if (_c == QMetaObject::ReadProperty) { 
     void *_v = _a[0]; 
     switch (_id) { 
     case 0: *reinterpret_cast< QString*>(_v) = objectName(); break; 
     } 
     _id -= 1; 
    } else if (_c == QMetaObject::WriteProperty) { 
     void *_v = _a[0]; 
     switch (_id) { 
     case 0: setObjectName(*reinterpret_cast< QString*>(_v)); break; 
     } 
     _id -= 1; 
    } else if (_c == QMetaObject::ResetProperty) { 
     _id -= 1; 
    } else if (_c == QMetaObject::QueryPropertyDesignable) { 
     _id -= 1; 
    } else if (_c == QMetaObject::QueryPropertyScriptable) { 
     _id -= 1; 
    } else if (_c == QMetaObject::QueryPropertyStored) { 
     _id -= 1; 
    } else if (_c == QMetaObject::QueryPropertyEditable) { 
     _id -= 1; 
    } else if (_c == QMetaObject::QueryPropertyUser) { 
     _id -= 1; 
    } 
#endif // QT_NO_PROPERTIES 
    return _id; 
} 
+0

кусок кода, который я разместил от moc_ssObject.cpp –

+0

Doh .. Извините. Я обновил свой ответ и опубликовал код из моей недавней сборки Qt. – Macke

3

Он вызывает метод с индексом _id от класса _c с аргументами в списке _a.

Я считаю, что реализация генерируется moc, поэтому она не находится ни в каком исходном дереве.