我的连接代码如下:
QObject::connect(_scene, &VScene::activeObjectChanged, _scene->manipulatorNode(), &VManipulatorNode::onActiveObjectChanged);
VScene
是VNode
的子类,它是QObject
的子类。它们都包含Q_OBJECT
宏。
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
的{{1}}的{{1}}指针只包含空数据。
我看到QMetaObject
的{{1}}将指向VScene
的{{1}},QMetaObject
的{{1}}将指向VScene
{1}}的{1}}。此处,在崩溃位置,QMetaObject
的{{1}}仅包含空数据
所有moc文件,包括VNode
和QMetaObject
,都是由Qt生成的。
VNode
QMetaObject
注意:在Visual Studio中进行调试时,显示QObject
仅包含空数据,但它的所有静态成员都包含QMetaObject
和{ {1}}看起来正确(非空)。这是证据
代码发出信号:
VScene
答案 0 :(得分:0)
我注意到的第一件事是你应该改变:
public:
void onActiveObjectChanged(VObject *obj);
为:
public slots:
void onActiveObjectChanged(VObject *obj);
不确定所提供的信息是否可以解决问题,但这是不对的。
答案 1 :(得分:0)
我遇到了同样的问题。如果是相同的原因,则认为与QTBUG-38876有关。在我的情况下,信号/插槽连接是在静态对象的构造函数中创建的。延迟初始化全局静态变量后发生的连接为我解决了这个问题。