0

Qt のシグナルとスロットを使用すると、エラーが発生します。

Object::connect: No such signal FvOverlayPolygon::mouseHoveredOnElemSig(rf::AbstractFvOverlay*)

私の他connectのものは正常に動作し、考えられるすべてをチェックしました(Qtシグナルとスロットをデバッグする20の方法も参照)。shared_ptr個人的にforはこのサンプルで初めて使用するのでQt、使い方に問題があるのではないかと思いますshared_ptr。ご意見をお待ちしております。


コンクリートFvOverlay.cpp

#include "rf_common/abstractFvOverlay.h"

void FvScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
  rf::AbstractFvOverlay::Ptr item_overlay;
  item_overlay = this->createOverlay(myItemMenu, &pixmap_overlay); // this inherits Class A

  bool con1 = connect(item_overlay.get(), SIGNAL(mouseHoveredOnElemSig(rf::AbstractFvOverlay*)), this, SLOT(mouseHoveredOnElem(rf::AbstractFvOverlay*)));
  }
}

このオーバーレイは、abstractFvOverlay.cpp でインスタンス化されます。

boost::shared_ptr<rf::AbstractFvOverlay> FvPolygonScene::createOverlay(QMenu *menu, QPixmap *pixmap_overlay)
{
  return boost::shared_ptr<rf::AbstractFvOverlay>(new FvOverlayPolygon(menu, *pixmap_overlay));
}

オーバーレイ.h

#include <QGraphicsItem>
#include <boost/shared_ptr.hpp>

class AbstractFvOverlay : public QObject, public QGraphicsItem
{
Q_OBJECT

public:
  AbstractFvOverlay(QMenu *contextMenu, QGraphicsItem *parent, QGraphicsScene *scene);
  virtual ~AbstractFvOverlay();
  typedef boost::shared_ptr<AbstractFvOverlay> Ptr;

signals:
  void mouseHoveredOnElemSig(AbstractFvOverlay *i);

ご参考までに、ここで使用する理由は、shared_ptrインターフェースベースのプログラミングを行いたいからです (これがこのスタイルを呼び出す公式の方法であるかどうかはわかりませんが、私が意味するのは、抽象クラスで動作を定義し、それらを説明するいくつかの動作に対してのみです。 Java が許可する具象クラス)。

4

1 に答える 1

0

同じスコープ内にいる場合でも、シグナル宣言では型の完全なスコープ名を使用する必要があります。信号void mouseHoveredOnElemSig(AbstractFvOverlay *i);void mouseHoveredOnElemSig(rf::AbstractFvOverlay *i);接続に置き換えるか、スコープなしで AbstractFvOverlay を使用します。

于 2012-08-12T23:49:17.920 に答える