对象::连接:当 obj 作为shared_ptr返回时没有这样的信号

Object::connect: No such signal when obj is returned as shared_ptr

本文关键字:信号 返回 ptr 连接 obj 作为 shared 对象      更新时间:2023-10-16

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

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

我的其他connect工作正常,我已经检查了我能想到的所有内容(参考了 20 种调试 Qt 信号和插槽的方法)。因为我个人第一次使用shared_ptr Qt这个样本,所以我怀疑我使用shared_ptr的方式可能有问题。我非常感谢您的意见。


具体Fv覆盖.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*)));
  }
}

此叠加层实例化如下:抽象FvOverlay.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 允许)。

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