Что делает следующая функция? - PullRequest
0 голосов
/ 11 февраля 2010

Я ищу реализацию функции 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 называется?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010

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

Вот из моей сборки (4.6.1 на windows):

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;
}
3 голосов
/ 11 февраля 2010

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

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

...