如何检测对象来自哪个类? Qt
Posted
技术标签:
【中文标题】如何检测对象来自哪个类? Qt【英文标题】:How to detect what class an object is from? Qt 【发布时间】:2015-08-13 22:19:41 【问题描述】:我正在用球在 QT 中编写物理模拟,这是我用来检测球之间碰撞的碰撞检测。
bool Ball:: circCollide(QList <QGraphicsItem *> items)
QPointF c1 = mapToScene( this->boundingRect().center());
// qDebug() << "c1x" << c1.x();
// qDebug() << "c1y" << c1.y();
// qDebug() << "Listcount3: " << scene()->collidingItems(this).count();
foreach (QGraphicsItem * t, items)
// qDebug() << "Classname: " << typeid(t).name();
// if (typeid(t).name() == "Ball")
if ( t->boundingRect().width()<200)
double distance = QLineF(c1,mapToScene( t->boundingRect().center())).length();
// qDebug() << "tx" << mapToScene(t->boundingRect().center()).x();
// qDebug() << "ty" << mapToScene (t->boundingRect().center()).y();
double radius1 = this->boundingRect().width() / 2;
double radius2 = t->boundingRect().width() / 2;
double radii = radius1 + radius2;
// qDebug () << "distance radius1: " << radius1;
// qDebug () << "distance radius2: " << radius2;
// qDebug () << "distance :" << distance;
if ( distance <= radii )
// qDebug() << "true collision";
return true;
// qDebug() << "false collision";
return false;
现在我有一个问题,当它们与我的墙壁发生碰撞时,有时也需要这样做。 这些球有我自己制作并继承自 QGraphicsItem 的 Class Ball, 而墙壁有 QLineF 类,它也继承自 Qgraphicsitem。有什么好方法可以确定对象“t”是否属于 Ball 类? 我已经试过了
typeid(t).name()
但这两个类的返回值相同 (P13QGraphicsItem)。
此外,我在开头提供的列表包含与该项目冲突的所有对象,因此我必须为其提供 QGraphicsItems 列表。
【问题讨论】:
QLineF
是一个现有的 Qt 类,它带有四个 qreal
值。它并非源自QGraphicsItem
。你说的墙是什么等级的?为什么不能将dynamic_cast
用于派生类型并以这种方式进行验证?说dynamic_cast<Ball*>(...)
或dynamic_cast<Wall*>(...)
。
【参考方案1】:
在 Ball 中覆盖 QGraphicsItem::type
。返回高于UserType
的值,然后在每个QGraphicsItem
上调用type 以确定它是否为Ball
。
【讨论】:
【参考方案2】:如果Ball
派生自QObject
,并且在其声明中包含Q_OBJECT
宏,您可以简单地调用QObject::metaObject
和QMetaObject::className
:
t->metaObject()->className();
【讨论】:
【参考方案3】:您可以尝试类似于此示例的投射:
Tag* tag = new Tag();
Polygon* polygon = new Polygon();
Polygon* polygon_cast = dynamic_cast<Polygon*>(polygon);
if(polygon_cast) qDebug() << "Cool!";
else qDebug() << "oh..";
Tag* tag_cast = dynamic_cast<Tag*>(tag);
if(tag_cast) qDebug() << "Cool!";
else qDebug() << "oh..";
【讨论】:
以上是关于如何检测对象来自哪个类? Qt的主要内容,如果未能解决你的问题,请参考以下文章
Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?