我的代码:
//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>
答案 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);
}
};