我在调试代码时遇到问题。在一些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
案件结束:)
答案 0 :(得分:0)
从UIElementInterface
类声明中可以清楚地看出,该类不是QObject
。关于qobject_cast
函数的Qt文档声明:
T类必须继承(直接或间接)QObject并且是 用Q_OBJECT宏声明。
因此,您无法将qobject_cast
与UIElementInterface
类一起使用。