【发布时间】:2016-10-20 19:14:31
【问题描述】:
我有一个派生自 QGraphicsEllipseItem 的类,我需要知道它的位置或大小何时发生任何变化。我用鼠标处理大小调整并调用 QGraphicsEllipse::setRect。
好的,所以我尽职尽责地覆盖了类中的 itemChange() 方法,然后在创建后小心地设置了 ItemSendsGeometryChanges 标志
// Returns a human readable string for any GraphicsItemChange enum value
inline std::string EnumName(QGraphicsItem::GraphicsItemChange e);
// Simple test ellipse class
class MyEllipse : public QGraphicsEllipseItem
{
public:
MyEllipse(int x, int y, int w, int h) : QGraphicsEllipseItem(x, y, w, h)
{
setFlags(
QGraphicsItem::ItemIsSelectable
| QGraphicsItem::ItemIsMovable
| QGraphicsItem::ItemSendsGeometryChanges);
}
// QGraphicItem overrides
virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override
{
std::stringstream oss;
oss << "ItemChange " << EnumName(change) << std::endl;
OutputDebugString(oss.str().c_str());
return __super::itemChange(change, value);
}
};
我的主要代码创建其中之一,将其添加到场景中,然后尝试移动/调整其大小。
虽然我总是在椭圆上调用 setPos() 后收到通知,但在调用 setRect() 后我没有收到通知。我可以使用 setRect 来完全改变椭圆的几何形状,但我的 itemChange 覆盖永远不会被调用。没有任何标志。
现在显然更改项目的 rect 正在更改其几何形状,那么我错过了什么?
我应该设置其他标志吗?其他一些改变我应该使用的椭圆大小的方法?我可以覆盖其他一些虚拟通知?
【问题讨论】:
-
首先,您的
itemChange的前3 行可以交换为qDebug() << change;...其次,您期望QGraphicsItem::GraphicsItemChange的值是多少?最接近的值是ItemTransformChange和ItemScaleChange,但它们与一些不同的事物相关。您可以尝试通过setTransform方法调整椭圆的大小,应该会收到其中一个。 -
我想我希望 GraphicsItemChange 中有一些值可以涵盖这一点,因为它显然是对项目几何的更改,并且我专门设置了通知该几何更改的标志。如果仅将项目的位置视为其几何形状的一部分,则此通知中似乎存在明显差距。我可以随意移动椭圆,但似乎没有办法调整它的大小并收到通知
标签: qt