我有我的抽象类(A
),它描述了一个字段旅行和Qt基类QGraphicsItem
,它描述了用于控制项目的Qt函数。我想从这些类继承他们的项目。
问题在于QList <QGraphicsItem *>
中存储的项目列表,无法直接访问字段A ::
,也不想使用dynamic_cast
。还有什么其他选择?
重要的是该项目可能不是最终的子项,即它可以从其他项目继承(以及通过多重继承)。
仅在QList <QGraphicsItem *>
中保留从A
和QGraphicsItem
继承的元素。你有什么建议?谢谢你的帮助。
UPD1: 这段代码:
QList<QGraphicsItem *> items=scene->items();
for(int i=0;i<items.size();++i){
std::cerr<<"\n"<<items.at(i)->entity::getX();
}
(entity
是A
)抛出错误:
/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87: error: 'entity' is not a base of 'QGraphicsItem' std::cerr<<"\n"<<items.at(i)->entity::getX(); ^
答案 0 :(得分:1)
/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87:错误:'entity'不是'QGraphicsItem'的基础std :: cerr&lt;&lt;“\ n”&lt;实体::的getX();
您正在尝试访问基类,而您的实体类(奇怪地没有CamelCase命名)不会继承它。
是的,所以这就是动态强制转换的用例,就像C ++中的dynamic_cast
一样。你应该利用它。
话虽如此,对于QObjects
,最好在Qt世界中使用qobject_cast
而不是原始dynamic_cast
。 QGraphicsItem故意不是QObject,虽然你的其他基础(实体)可能是,但这不相关。
这段代码可以帮到你:
QList<QGraphicsItem *> items = scene->items();
foreach (GraphicsItem* item, items) {
entity *e = dynamic_cast<entity*>(item);
if (e)
qDebug() << e->getX();
}
免责声明:我没有测试过这段代码,但我认为这个概念是有效的。
既不需要stderr,也不需要显式的索引循环。您可以使用Qt调试功能按照您的意愿进行打印,并预先浏览元素。
此外,在Qt世界中,“getX”并不是一个普通的惯例。人们倾向于放弃“获取”前缀,而不是打字。