Object :: connect:obj作为shared_ptr返回时没有这样的信号

时间:2012-08-12 23:40:44

标签: c++ qt4 shared-ptr qt-signals

使用Qt的信号&插槽,我收到错误:

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

我的其他connect工作正常,我已经检查了我能想到的一切(也称为20 ways to debug Qt signals and slots)。因为我个人第一次使用shared_ptr作为此示例的Qt,我怀疑我使用shared_ptr的方式可能有问题。我非常感谢你的意见。


concreteFvOverlay.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));
}

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允许)。

1 个答案:

答案 0 :(得分:0)

即使您在同一范围内,也必须在信号声明中使用类型的全范围名称。将信号void mouseHoveredOnElemSig(AbstractFvOverlay *i);替换为void mouseHoveredOnElemSig(rf::AbstractFvOverlay *i);,或在连接中使用不带范围的AbstractFvOverlay。