Russian Qt Forum

Qt => Общие вопросы => Тема начата: once_again_abc от Сентябрь 03, 2011, 15:58



Название: [РЕШЕНО] connect возвращает err_method_notfound для слота
Отправлено: once_again_abc от Сентябрь 03, 2011, 15:58
вот такой код:

Класс сигнала:
Код:
    signals:
        void pausePlot( bool bPause );
    ...
    connect( this, SIGNAL(pausePlot(bool)), QMainApp::GetApp()->Plotter(), SLOT(pausePlot(bool)) );
    ...

connect вызывается когда _все_ объекты приложения созданы и валидны.

МОК для сигнала:

Код:
int QAppToolBar::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QToolBar::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: pausePlot((*reinterpret_cast< bool(*)>(_a[1]))); break;
        case 1: on_StartButton_Toggle((*reinterpret_cast< bool(*)>(_a[1]))); break;
        case 2: on_PauseButton_Toggle((*reinterpret_cast< bool(*)>(_a[1]))); break;
        default: ;
        }
        _id -= 3;
    }
    return _id;
}

Класс слота (наследник QWidget):

Код:
    private slots:
        void pausePlot( bool bPause );

МОК для слота:

Код:
int QPlotter::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QWidget::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: pausePlot((*reinterpret_cast< bool(*)>(_a[1]))); break;
        default: ;
        }
        _id -= 1;
    }
    return _id;
}

QMainApp::GetApp() - возвращает указатель на объект-синглтон (статик,валидный)
QMainApp::GetApp()->Plotter() - возвращается указатель на объект типа QWidget (статик,валидный)

qobject.cpp:qFlagLocation:2207 возвращет всегда правильный метод (по крайней мере имя слота верное).

проблемы начинаются здесь:

qobject.cpp:connect:2547:
Код:
    
    const QMetaObject *rmeta = receiver->metaObject();
    int method_index = -1;
    switch (membcode) {
    case QSLOT_CODE:
        method_index = QMetaObjectPrivate::indexOfSlot(rmeta, method, false);
        break;
    case QSIGNAL_CODE:
        method_index = QMetaObjectPrivate::indexOfSignalRelative(&rmeta, method, false);
        if (method_index >= 0)
            method_index += rmeta->methodOffset();
        break;
    }
    if (method_index < 0) {
        // check for normalized methods
        tmp_method_name = QMetaObject::normalizedSignature(method);
        method = tmp_method_name.constData();

        // rmeta may have been modified above
        rmeta = receiver->metaObject();
        switch (membcode) {
        case QSLOT_CODE:
            method_index = rmeta->indexOfSlot(method); [b]<------ вот здесь получаем -1[/b]
            break;
        case QSIGNAL_CODE:
            method_index = rmeta->indexOfSignal(method);
            break;
        }
    }

ну и дальше все ясно:

Код:
    if (method_index < 0) {
        err_method_notfound(receiver, method_arg, "connect");
        err_info_about_objects("connect", sender, receiver);
        return false;
    }

что я сделал не так? почему сигнал не связывается со слотом?


Название: Re: connect возвращает err_method_notfound для слота
Отправлено: once_again_abc от Сентябрь 03, 2011, 16:25

прошу прощения за беспокойство =) все заработало. заблудился в наследовании =)