项目场景:
最近在使用Qt的QGraphicsView\item\scene时,莫名出现bus error,最后发现是转型的问题。用到了qgraphicsitem_cast的函数,官方文档描述如下(想使用该函数要重写type,返回值必须大于等于UserType(65536) ):
template T qgraphicsitem_cast(QGraphicsItem *item)
Returns the given item cast to type T if item is of type T; otherwise, nullptr is returned.
Note:To make this function work correctly with custom items, reimplement the type() function for each custom QGraphicsItem subclass.’
问题描述
实际使用的时候,有多个类,分别继承自QGraphicsItem,
type依次+1、+2、+3…
但是使用qgraphicsitem_cast对一个未知的item对象转型时,并没有准确转型,不对的类型也转过去了
GraphNode * node = qgraphicsitem_cast<GraphNode *>(watched);
GraphEdge * edge = qgraphicsitem_cast<GraphEdge *>(watched);
GraphGroup* group = qgraphicsitem_cast<GraphGroup*>(watched);
qDebug() << node << " " << edge << " " << group << " " << 45 ;
debug之后可以看到:
全部都转成功了
解决方案:
把qgraphicsitem_cast改为dynamic_cast即可解决