由于QMetaObject :: superdata,QObject :: connect在signalOffset(senderMetaObject)崩溃包含空数据

时间:2016-04-25 03:14:40

标签: c++ qt qt5 signals-slots

我的连接代码如下:

QObject::connect(_scene, &VScene::activeObjectChanged, _scene->manipulatorNode(), &VManipulatorNode::onActiveObjectChanged);

VSceneVNode的子类,它是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);
}

VNODE:

class VNode : public QObject
{
    Q_OBJECT
}

VManipulator:

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文件,包括VNodeQMetaObject,都是由Qt生成的。

moc_VScene.cpp:

VNode

moc_VNode.cpp:

QMetaObject

注意:在Visual Studio中进行调试时,显示QObject仅包含空数据,但它的所有静态成员都包含QMetaObject和{ {1}}看起来正确(非空)。这是证据 enter image description here

代码发出信号:

VScene

2 个答案:

答案 0 :(得分:0)

我注意到的第一件事是你应该改变:

public:
    void onActiveObjectChanged(VObject *obj);

为:

public slots:
    void onActiveObjectChanged(VObject *obj);

不确定所提供的信息是否可以解决问题,但这是不对的。

答案 1 :(得分:0)

我遇到了同样的问题。如果是相同的原因,则认为与QTBUG-38876有关。在我的情况下,信号/插槽连接是在静态对象的构造函数中创建的。延迟初始化全局静态变量后发生的连接为我解决了这个问题。