如何检测对象来自哪个类? Qt的

时间:2015-08-13 22:19:41

标签: c++ qt types detection

我在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, 墙上有QLineF类,它也继承了Qgraphicsitem。有没有什么好方法可以弄清楚对象是否&#34; t&#34;属于Ball类? 我已经尝试了

typeid(t).name() 

但两个类的返回值相同(P13QGraphicsItem)。

此外,我在开头提供的列表包含与此项目冲突的所有对象,因此我必须提供一个QGraphicsItems列表。

3 个答案:

答案 0 :(得分:2)

在Ball中覆盖QGraphicsItem::type。返回高于UserType值的内容,然后在每个QGraphicsItem上调用类型以确定它是否为Ball

答案 1 :(得分:0)

您可以尝试类似于此示例的投射:

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..";

答案 2 :(得分:0)

如果Ball来自QObject,并且其声明中包含Q_OBJECT宏,则只需致电QObject::metaObjectQMetaObject::className

t->metaObject()->className();