Python & Qt、QGraphicsScene 碰撞和 typeid来自 C++

问题描述

我在寻求有关此主题的帮助时遇到了大麻烦。

我设法进行了碰撞检测,但现在我想检测碰撞对象的类型。 现在是 QGraphicspixmapItem。

我已经用 C++ 编码了,但现在 python 不知道 typeid 我不知道该怎么做。

Python 函数

def IsColliding(self,charView):
        collision_list = self.Map_Scene.collidingItems(charView,mode=QtCore.Qt.IntersectsItemShape)
        if collision_list:
            print(collision_list)
            print(typeid(collision_list[0])) ## Error here
            return True
        else:
            return False

工作 C++ 等效代码

void xGame::placeBlock(int xpos,int ypos,QString blockName,bool isObs) {
    //place new block
    block = new xBlock(blockName,isObs);
    block->setPos(xpos,ypos);
    block->setZValue(1);
    scene->addItem(block);

    //remove old block
    QList<QGraphicsItem *> colliding_items = block->collidingItems();
    for (int i = 0,n = colliding_items.size(); i < n; ++i) {
        if (typeid(*(colliding_items[i])) == typeid(xBlock)) {
            scene->removeItem(colliding_items[i]);
            delete colliding_items[i];
        }
    }
}

解决方法

基类 QGraphicsItem 有一个“type”方法,它返回一个“int”,正是为此目的。它应该比使用 typeid 或任何涉及字符串查找或比较的东西更有效。 QGraphicsItem 派生的每个内置类都有一个唯一的类型,当你派生自己的类时,只需在你的类中实现“type”方法并返回一个唯一值即可。

查看 QGraphicsItem::UserType 的文档。那里有一个例子。 Qt 为自己预留了最多 65535 的值,用户类型从 65536 开始。