返回私人会员时的Segfault

时间:2016-03-21 12:46:29

标签: c++ qt

我在调试代码时遇到问题。在一些Qt Slot中,我这样做:

UIElementInterface* interface = qobject_cast <UIElementInterface*>(sender());

并且以下行给出了分段错误:

QStringList data = interface->getSetDefData();

这不是

QString hello = interface->getHello();

getSetDefData()UIElementInterface的实施:

class UIElementInterface
{
public:
    ...
    UIElementInterface(const QStringList& data) : m_setDefData(data)
    {
        std::cout << qPrintable(m_setDefData[0]) << std::endl; //everything as expected here..
    }

    QStringList getSetDefData(){return m_setDefData;} //gives seg fault
    QString getHello(){return QString("Hello");} //works fine

private:
    QStringList m_setDefData;
};

我很感激这方面的任何帮助:)

修改 根据评论,我使用qobject_cast转换为CheckBox,它肯定是发件人(在崩溃的情况下),它是一个子类QCheckBox。所以它肯定是ihnerits QObject(我还仔细检查了实现)。当我按照建议检查返回值时,结果是0

CheckBox* b = qobject_cast<CheckBox*>(sender());
if (b == 0)
{
    std::cout << "Here we are" << std::endl;
}

这就是问题所在。我仍然需要弄清楚为什么会这样,但这可能会导致崩溃。

另一个编辑打印出类名sender()->metaObject()->className()暴露出邪恶之根:

QSignalMapper

案件结束:)

1 个答案:

答案 0 :(得分:0)

UIElementInterface类声明中可以清楚地看出,该类不是QObject。关于qobject_cast函数的Qt文档声明:

  

T类必须继承(直接或间接)QObject并且是   用Q_OBJECT宏声明。

因此,您无法将qobject_castUIElementInterface类一起使用。