Мой код подключения выглядит следующим образом:
QObject::connect(_scene, &VScene::activeObjectChanged, _scene->manipulatorNode(), &VManipulatorNode::onActiveObjectChanged);
VScene
является подклассом VNode
, который является подклассом QObject
. Оба они содержат макрос Q_OBJECT
.
VScene является отправителем сигнала:
class VScene : public VNode
{
Q_OBJECT
public slots:
void markActiveObject(VObject *obj);
void unmarkActiveObject(VObject *obj);
signals:
void activeObjectChanged(VObject *obj);
}
ВУзел:
class VNode : public QObject
{
Q_OBJECT
}
Вманипулятор:
class VManipulatorNode : public VNode
{
public:
void onActiveObjectChanged(VObject *obj);
}
Программа вылетает при вызове QObject::connect
, в функции
signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject);
Во время отладки я обнаружил, что superdata
pointer QMetaObject
отправителя VScene
содержит только нулевые данные.
Я вижу, что QMetaObject
из VScene
будет указывать на QMetaObject
из VNode
, а затем QMetaObject
из VNode
будет указывать на QMetaObject
из QObject
. Здесь, в месте аварии, QMetaObject
из VScene
содержит только нулевые данные.
Все файлы moc, включая moc_VScene
и moc_VNode
, обычно генерируются Qt.
moc_VScene.cpp:
const QMetaObject vk::VScene::staticMetaObject = {
{ &VNode::staticMetaObject, qt_meta_stringdata_vk__VScene.data,
qt_meta_data_vk__VScene, qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};
moc_VNode.cpp:
struct qt_meta_stringdata_vk__VNode_t {
QByteArrayData data[1];
char stringdata0[10];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
qptrdiff(offsetof(qt_meta_stringdata_vk__VNode_t, stringdata0) + ofs \
- idx * sizeof(QByteArrayData)) \
)
static const qt_meta_stringdata_vk__VNode_t qt_meta_stringdata_vk__VNode = {
{
QT_MOC_LITERAL(0, 0, 9) // "vk::VNode"
},
"vk::VNode"
};
#undef QT_MOC_LITERAL
static const uint qt_meta_data_vk__VNode[] = {
// content:
7, // revision
0, // classname
0, 0, // classinfo
0, 0, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
0 // eod
};
void vk::VNode::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
Q_UNUSED(_o);
Q_UNUSED(_id);
Q_UNUSED(_c);
Q_UNUSED(_a);
}
const QMetaObject vk::VNode::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_vk__VNode.data,
qt_meta_data_vk__VNode, qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};
ПРИМЕЧАНИЕ: при отладке в Visual Studio показано, что VNode::staticMetaObject
содержит только нулевые данные, но это так странно, что все его статические члены, включая qt_meta_stringdata_vk__VNode
и qt_meta_data_vk__VNode
, выглядят правильно (не нулевыми). Вот доказательства
Код, излучающий сигнал:
void VScene::markActiveObject(VObject *obj)
{
if (obj){
obj->markActive();
emit activeObjectChanged(obj);
}
}