如何检测 class 对象的来源? Qt
How to detect what class an object is from? Qt
我正在 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;
}
现在我遇到的问题是,当它们与我的墙壁发生碰撞时,有时也会调用此方法。
这些球有我自己制作的 Class Ball 并继承自 QGraphicsItem,
而墙壁有 class QLineF,它也继承自 Qgraphicsitem。有没有什么好的方法可以判断一个对象 "t" 是否属于 class 球?
我已经试过了
typeid(t).name()
但是 returns 两个 classes (P13QGraphicsItem) 相同。
此外,我在开始时提供的列表包含与该项目碰撞的所有对象,因此我必须为其提供 QGraphicsItems 列表。
在 Ball 中覆盖 QGraphicsItem::type
。 Return 高于 UserType
的值,然后在每个 QGraphicsItem
上调用 type 以确定它是否是 Ball
.
您可以尝试类似于此示例的转换:
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..";
如果 Ball
派生自 QObject
,并且在其声明中有 Q_OBJECT
宏,您可以简单地调用 QObject::metaObject
and QMetaObject::className
:
t->metaObject()->className();
我正在 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;
}
现在我遇到的问题是,当它们与我的墙壁发生碰撞时,有时也会调用此方法。 这些球有我自己制作的 Class Ball 并继承自 QGraphicsItem, 而墙壁有 class QLineF,它也继承自 Qgraphicsitem。有没有什么好的方法可以判断一个对象 "t" 是否属于 class 球? 我已经试过了
typeid(t).name()
但是 returns 两个 classes (P13QGraphicsItem) 相同。
此外,我在开始时提供的列表包含与该项目碰撞的所有对象,因此我必须为其提供 QGraphicsItems 列表。
在 Ball 中覆盖 QGraphicsItem::type
。 Return 高于 UserType
的值,然后在每个 QGraphicsItem
上调用 type 以确定它是否是 Ball
.
您可以尝试类似于此示例的转换:
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..";
如果 Ball
派生自 QObject
,并且在其声明中有 Q_OBJECT
宏,您可以简单地调用 QObject::metaObject
and QMetaObject::className
:
t->metaObject()->className();