вот такой код:
Класс сигнала:
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;
}
что я сделал не так? почему сигнал не связывается со слотом?