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

C++ Object::connect:当obj作为shared_ptr返回时,没有这样的信号,c++,qt4,shared-ptr,qt-signals,C++,Qt4,Shared Ptr,Qt Signals,使用Qt的信号和插槽,我得到错误: Object::connect: No such signal FvOverlayPolygon::mouseHoveredOnElemSig(rf::AbstractFvOverlay*) 我的另一个connects工作正常,我已经检查了我能想到的一切(也参考了)。因为我个人第一次将shared\u ptr用于Qt用于此示例,我怀疑我使用shared\u ptr的方式可能有问题。我真的很感激你的意见 concreteFvOverlay.cpp #incl

使用Qt的信号和插槽,我得到错误:

Object::connect: No such signal FvOverlayPolygon::mouseHoveredOnElemSig(rf::AbstractFvOverlay*)
我的另一个
connect
s工作正常,我已经检查了我能想到的一切(也参考了)。因为我个人第一次将
shared\u ptr
用于
Qt
用于此示例,我怀疑我使用
shared\u 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*)));
  }
}
boost::shared_ptr<rf::AbstractFvOverlay> FvPolygonScene::createOverlay(QMenu *menu, QPixmap *pixmap_overlay)
{
  return boost::shared_ptr<rf::AbstractFvOverlay>(new FvOverlayPolygon(menu, *pixmap_overlay));
}

此覆盖在以下内容中实例化: abstractFvOverlay.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*)));
  }
}
boost::shared_ptr<rf::AbstractFvOverlay> FvPolygonScene::createOverlay(QMenu *menu, QPixmap *pixmap_overlay)
{
  return boost::shared_ptr<rf::AbstractFvOverlay>(new FvOverlayPolygon(menu, *pixmap_overlay));
}
boost::shared_ptr fvpolygonsene::createOverlay(QMenu*菜单,QPixmap*pixmap_覆盖)
{
返回boost::shared_ptr(新的FvOverlayPolygon(菜单,*pixmap_覆盖));
}

叠加

#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);
#包括
#包括
类AbstractFvOverlay:publicQObject,publicQGraphicsitem
{
Q_对象
公众:
AbstractFvOverlay(QMenu*上下文菜单,QGraphicsItem*父对象,qgraphicscene*场景);
虚拟~AbstractFvOverlay();
typedef boost::shared_ptr ptr;
信号:
无效鼠标覆盖图(抽象FvOverlay*i);

出于您的兴趣,我之所以在这里使用
shared\u ptr
,是因为我想进行基于接口的编程(不确定这是否是一种正式的方式来调用这种风格,但我的意思是在抽象类中定义行为,并且仅针对一些行为,我在具体类中描述它们,这是Java允许的).

即使在同一作用域中,也必须在信号声明中使用类型的完整作用域名称。将信号
void mousehoredonelemsig(AbstractFvOverlay*i);
替换为
void mousehoredonelemsig(rf::AbstractFvOverlay*i);
或在连接中使用AbstractFvOverlay而不使用作用域。

您的建议没有真正起作用。但是,删除类AbstractFvOverlay的命名空间声明使我的连接成功(这不是理想的解决方法…我稍后会更深入地了解,但现在很好)。它甚至与共享无关。\u ptr…感谢您的见解。