2017-06-30 12 views
0

マウスイベントをオーバーライド/作成するためにGraphicsPixmapItemというクラスをQGraphicsPixmapItemから継承しました。問題は、いくつかの計算が実行された後に信号を出したいが、このクラスはQObjectではないので、いくつかのハッキングが実行されない限り不可能であるように見えるということです。Qt:QGraphicsPixmapItemクラスの信号とスロット

これを行うには、私はQObjectからaformentionedされた新しいクラスを継承しようとしましたが、コンパイラエラーが発生しています。

マイattemp:

ヘッダファイル(graphicspixmapitem.h):

#ifndef GRAPHICSPIXMAPITEM_H 
#define GRAPHICSPIXMAPITEM_H 
#include <QObject> 
#include <QGraphicsPixmapItem> 
#include <QGraphicsSceneMouseEvent> 

class GraphicsPixmapItem : public QObject, public QGraphicsPixmapItem 
{ 
    Q_OBJECT 
public: 
    explicit GraphicsPixmapItem(QGraphicsItem *parent = 0); 
    virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent); 
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent); 
signals: 
    void translationVector(QPointF info); 
}; 

#endif // GRAPHICSPIXMAPITEM_H 

ソースファイル(graphicspixmapitem.cpp):

#include "graphicspixmapitem.h" 

GraphicsPixmapItem::GraphicsPixmapItem(QGraphicsItem *parent) : 
    QGraphicsPixmapItem(parent) 
{ 

} 

void GraphicsPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent) 
{ 
    //Code 
} 

void GraphicsPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent) 
{ 
    QPointF info; 
    //Code 
    emit(translationVector(info)); 
} 

そして、私はトンを取得彼は、次のリンカエラー:GraphicsPixmapItemためのvtable `へ

未定義の参照 ' ` GraphicsPixmapItem :: translationVector(QPointF)へ

未定義の参照'

応じ進め方についての任意の手掛かり?

サイドノート:

私はQGraphicsObjectは良い選択肢を得ることを認識していますが、hereを議論したように、性能が厳しく彼らと一緒に動作しているときに放出される信号の量、それらのほとんどの影響を受けて見えます私の場合は使用されません。これは、QGraphicsObjectの代わりにQGraphicsItemという基数で独自のクラスを作成することを好む理由です。

事前に感謝します。

答えて

1

メタオブジェクトコンパイラ(moc)がコードに対して実行されていないか、リンク時にmocの結果が含まれていないようです。

  • qmakeのHEADERS変数にgraphicspixmapitem.hを追加しましたか?
  • qmakeを再実行して一般的なクリーンビルドを試しましたか?
  • mocはgraphicspixmapitem.hで実行されていますか?コンパイルログを確認してください。
  • リンク時にgraphicspixmapitem_moc.oが含まれていますか?コンパイルログを確認してください。
+0

前に2つの最初の点を確認しましたが、3番目の点は満たされていないようです(mocはgraphicspixmapitem.hで実行されていません)。私はこれをどのように修正すべきですか? – ksb496

+0

mocコマンドは、qmakeによってMakefileに追加されます。 qmakeはHEADERS変数のすべてのヘッダーファイルをスキャンし、そこにQ_OBJECTマクロを探します。見つかるとすぐにmocを呼び出すMakefileルールを作成する必要があります。 –

+0

それは、上で解説したコードに何らかのエラーがあって、qmakeがこのクラス(ヘッダおよび/またはソース)を認識しないようにするためです。 Q_OBJECTマクロ、QObjectクラスとシグナルの継承を削除すると、正しくコンパイルされますが、派生クラスで最終的に使用したいシグナル/スロットを使用できなくなります。 – ksb496

1

私は最終的にリンクエラーを含む問題を発見しました。この意味で、問題の原因を探す重要なアイデアを指摘してくれたThomas McGuireに感謝する必要があります。

理由は、数日前、私は、すなわち、GraphicsPixmapItem(ヘッダファイルgraphicspixmapitem.hと、ソースファイルgraphicspixmapitem.cppで)、これよりも正確に同じ名前で(他の目的のために)QGraphicsPixmapItemをサブクラス化しようとしたことです。

私がやったとき、私は最終的に私が別のやりかたでやることができたとわかりました。継承されたサブクラスが不要になったので、プロジェクトからこれらのファイルを削除しました。 qmakemoc*.omoc_*.cppmoc_*.o)によって生成されたファイルは、ビルド/デバッグディレクトリに残っているため、プロジェクトからファイルを削除する前にプロジェクトをクリーンアップしないと、これは大きなミスです。プロジェクトを消去しても削除されないため、手動で削除してください。

したがって、qmakeは、ファイルがすでに存在し、更新されたクラスから正しいものを生成しないことを検出して、上で説明したリンクエラーを引き起こします。

要約すると、プロジェクトからいくつかのファイルを削除する場合は、特に、Q_OBJECTマクロを持つクラスを削除する場合は、以前にそれをきれいにしてください。

+0

あなたの問題を見つけてうれしいです! –

関連する問題