1

我在 QGraphicsScene 上放置了两种自定义类型,这是它们的声明:

class FotoGebouw : public QGraphicsItem
{
public:
    explicit FotoGebouw();
    ~FotoGebouw();
    Gebouw *linkGebouw;
    enum ItemType { TypeFotoGebouw = UserType + 1, TypeFotoPlantage = UserType + 2};
    int type(){ return TypeFotoGebouw; }
signals:  
public slots: 
};

class FotoPlantage : public QGraphicsItem
{
public:
    explicit FotoPlantage();
    ~FotoPlantage();
    Plantage *linkPlantage;
    enum ItemType { TypeFotoGebouw = UserType + 1, TypeFotoPlantage = UserType + 2};
    int type(){ return TypeFotoPlantage; }   
signals:  
public slots: 
};

现在,当我在 QGraphicsScene 上选择一个项目时,我想找出这两个类的类型,但我该怎么做呢?我尝试了以下方法,但它总是返回相同的类型......:S提前感谢

    QGraphicsItem *item = bordscene->selectedItems().at(0);
        if (item->type()==7)
            checkGebouwSelectie();
        else if (item->type()==8)
            checkPlantageSelectie();
4

2 回答 2

3

您实际上并没有覆盖 type 函数。您的int type()函数是非常量的,而类文档显示虚拟 QGraphicsItem 函数是常量。常量需要匹配您的函数以覆盖 QGraphicsItem 函数。

如果您有 C++11 编译器,则可以指定override以确保如果您的函数实际上没有覆盖虚拟方法,则它是编译器错误。从 Qt5 开始,在QtGlobalQ_DECL_OVERRIDE中定义了一个宏,它将成为支持它的编译器的 override 关键字,或者对于不支持它的编译器则没有。

我还注意到您也在检查item->type()==7and item->type()==8。在我方便的 Qt 版本(4.7.2)中,这些类型值分别对应于 QGraphicsPixmapItem 和 QGraphicsTextItem。你确定这些是你正在寻找的价值观吗?我希望比较是item->type() == FotoGebouw::TypeFotoGebouwand item->type() == FotoGebouw::TypeFotoPlantage

于 2013-06-12T16:58:46.710 回答
0

qgraphicsitem_cast用你的方法会有问题,

template <class T> inline T qgraphicsitem_cast(QGraphicsItem *item)
{
    return int(static_cast<T>(0)->Type) == int(QGraphicsItem::Type)
        || (item && int(static_cast<T>(0)->Type) == item->type()) ? static_cast<T>(item) : 0;
}

您应该按照文档http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#type中的示例进行操作

声明你的Type并将其作为结果返回int type() const

于 2014-04-17T09:19:15.563 回答