1

QGraphicsScene に 2 つのカスタム タイプを配置しました。これがその宣言です。

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 でアイテムを選択したときに、それらの 2 つのクラスのどちらのタイプかを調べたいのですが、どうすればよいでしょうか? 私は次のことを試しましたが、常に同じ型を返します... :S よろしくお願いします

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

2 に答える 2

3

実際には型関数をオーバーライドしていません。int type()関数は const ではありませんが、クラスのドキュメントには、仮想 QGraphicsItem 関数が const であることが示されています。関数が QGraphicsItem 関数をオーバーライドするには、constness が一致する必要があります。

C++11 コンパイラを使用している場合は、オーバーライドを指定て、関数が実際に仮想メソッドをオーバーライドしない場合にコンパイラ エラーになるようにすることができます。Qt5 の時点で、 QtGlobalQ_DECL_OVERRIDEで定義されたマクロがあり、それをサポートするコンパイラのオーバーライド キーワードになるか、サポートしないコンパイラでは何もしません。

また、あなたも と をチェックitem->type()==7していることに気付きitem->type()==8ました。私が持っている Qt のバージョン (4.7.2) では、これらの型の値はそれぞれ QGraphicsPixmapItem と QGraphicsTextItem に対応しています。それらが探している値であると確信していますか? item->type() == FotoGebouw::TypeFotoGebouw比較は と になると思い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 に答える