gpt4 book ai didi

c++ - 在这种情况下,qobject_cast 不应该默默地失败吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:01 25 4
gpt4 key购买 nike

我正在尝试用 Qt 编写一个应用程序,在我遇到这个愚蠢的问题之前,该应用程序运行得还算不错。我有一个 Node 类,它可以有一个指向 Workplace 类实例的指针。我还为该指针定义了 getter/setter 方法。像这样:

class Node : public QGraphicsItem
{
Q_DECLARE_TR_FUNCTIONS(Node)

public:
Node(const QString &type, Project* nodeProject);
~Node();

void setWorkplace(Workplace* workplace);
void removeWorkplace();
Workplace* usedWorkplace();

(...)
private:
Workplace* myWorkplace;
}

所以,现在在我的代码中,我必须检查某个 Node 是否有指向定义的 Workplace 的指针,以便对该信息进行一些操作。我就是这样做的:

Workplace* currentWorkplacePointer = qobject_cast<Workplace*>(node->usedWorkplace());
if(!currentWorkplacePointer){
// no workplace, do some stuff
}else{
// workplace exists, do other stuff
}

这工作得很好,但现在由于某种原因它会随机段错误。我说随机是因为有时,如果我尝试清理和重建项目,它会正常工作——即,qobject_cast 默默地失败并按我的预期进行;其他时候,即使我清理/重建,它也会再次出现段错误。

调试器控制台始终指向我上面代码中的对象转换行。据我所知,如果被转换的对象不存在,转换不应该简单地无提示地失败吗?

请注意,我是 Qt/C++ 的新手,因此非常感谢任何帮助和评论 - 请保持温柔! :) 提前致谢!

最佳答案

正如塞巴斯蒂安·雷德尔 (Sebastian Redl) 所说,将指针转换为自身类型似乎是无稽之谈。尽管如此,您的代码可以改进以供将来使用转换。我的第一点来自 qobject_cast 的文档强制在您的类 header 中调用 Q_OBJECT 宏才能使用。

其次,由于您的 Node 继承了 QGraphicsItem,我建议改用 qgraphicsitem_cast,这在处理或过滤时以不同的方式更快场景中出现的项目。改编自doc

 class Node : public QGraphicsItem
{
...
enum { Type = UserType + 1 };

int type() const
{
// Enable the use of qgraphicsitem_cast with this item.
return Type;
}
...
}

//in your application code
Node *n = qgraphicsitem_cast<Node*>(expected_pointer_on_node);
if (n) {
//then n points a Node
}

关于c++ - 在这种情况下,qobject_cast 不应该默默地失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com