Russian Qt Forum
Октябрь 01, 2024, 12:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] connect возвращает err_method_notfound для слота  (Прочитано 2466 раз)
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;
    }

что я сделал не так? почему сигнал не связывается со слотом?
« Последнее редактирование: Сентябрь 03, 2011, 16:25 от once_again_abc » Записан
once_again_abc
Гость
« Ответ #1 : Сентябрь 03, 2011, 16:25 »


прошу прощения за беспокойство =) все заработало. заблудился в наследовании =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 20.