如何检测对象来自哪个类? 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&lt;Ball*&gt;(...)dynamic_cast&lt;Wall*&gt;(...) 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果Ball 派生自QObject,并且在其声明中包含Q_OBJECT 宏,您可以简单地调用QObject::metaObjectQMetaObject::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示波器示例采样线程类在项目中是如何工作的?

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

如何知道哪个 Id 属于哪个对象?

Qt 如何比较来自 textEdit 的文本

SpriteKit - 如何检测使用触摸影响哪个节点?

Java:知道一个类的路径,如何知道这个类是来自哪个Jar包呢