无法转换来自' const QGraphicsItem *'的参数3 to' const QObject *',这是这个指针,对象是QGraphicsObject的子类

时间:2017-06-09 07:34:42

标签: c++ qt pointers

我的代码:

//forkliftitem.h
class ForkliftItem : public QGraphicsObject
{
    Q_OBJECT
    //some necessary code...
}

//forkliftitem.cpp
ForkliftItem::ForkliftItem()
{
    //some other code...
    connect(this, &ForkliftItem::faceChanged, this, &ForkliftItem::setRotation);
}

当我编译我的代码时会产生错误,如标题所示。当然,

  

无法从' const QGraphicsItem *'转换参数3到#const;   QObject *'

因为QGraphicsItem *并非继承自QObject我的this指针的类型为const ForkliftItem *,{{1 }}继承自ForkliftItem

编译信息有以下提示:

  

参见函数模板实例化的参考   ' QMetaObject :: Connection QObject :: connect< void(__ thiscall   ForkliftItem :: *)(int),void(__ thiscall QGraphicsItem :: *   )(qreal)>(const ForkliftItem *,Func1,const QGraphicsItem   ,FUNC2,QT :: ConnectionType)'正在编译[       Func1 = void(__thiscall ForkliftItem :: )(int)

可以看出:QGraphicsObject的参数3被处理为connect(),这就是为什么会产生编译错误。

我可以通过以下代码修复错误:

const QGraphicsItem *

但是当connect(this, &ForkliftItem::faceChanged, this, static_cast<void (ForkliftItem::*) (qreal)>(&ForkliftItem::setRotation)); 调用const ForkliftItem *成为const QGraphicsItem *时,我感到非常困惑,并且正确使用了参数1而没有使用参数3.任何人都知道,请告诉我,谢谢。< / p>

2 个答案:

答案 0 :(得分:1)

您的问题是setRotation是从QGraphicItem继承的成员,QGraphicItem是一个不会从QObject继承的类。 QGraphicsObject类继承自2个类:QObject和QGraphicItem。

将信号连接到lambda或创建自己的插槽并在那里调用该方法。

connect(this, &ForkliftItem::faceChanged, [this](qreal angle) { this->setRotation(angle); });

答案 1 :(得分:1)

  

我可以通过以下代码修复错误:

connect(this, &ForkliftItem::faceChanged, this, 
    static_cast<void (ForkliftItem::*) (qreal)>(&ForkliftItem::setRotation));

这是因为setRotation的签名是QGraphicsItem::setRotation,无论你在获取地址时指定了什么派生类,connect强制你调用的方法是在派生自的类中QObject

显式强制转换是安全的,并且是一种不会调用未定义行为的体面解决方法。另一种解决方法是重新实现该方法:

class ForkliftItem : public QGraphicsObject {
   Q_OBJECT
public:
   Q_SIGNAL void faceChanged(qreal);
   void setRotation(qreal angle) { QGraphicsObject::setRotation(angle); }
   ForkliftItem() {
      connect(this, &ForkliftItem::faceChanged, this, &ForkliftItem::setRotation);
   }
};