Ich habe eine Klasse von QGraphicsEllipseItem abgeleitet, in der ich wissen muss, wenn sich ihre Position oder Größe in irgendeiner Weise ändert. Ich handle die Größenänderung mit einer Maus und rufe QGraphicsEllipse :: setRect auf.QGraphicsItem :: itemChange wird für Positionsänderung, aber nicht für Größenänderung benachrichtigt
OK, so überwog ich pflichtschuldigst die itemChange() -Methode in der Klasse und dann war vorsichtig, um die ItemSendsGeometryChanges Flag zu setzen, nach dem Erstellen es
// 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);
}
};
Mein Haupt Code erstellt eine davon, fügt sie die Szene und versucht dann, es zu verschieben/zu skalieren.
Und während ich immer nach dem Aufruf von SetPos() auf der Ellipse Benachrichtigungen erhalten, bekomme ich keine Benachrichtigung nach dem Aufruf von SetRect(). Ich kann setRect verwenden, um die Geometrie der Ellipse vollständig zu ändern, aber meine itemChange override wird nie aufgerufen. Nicht mit irgendwelchen Flaggen.
Nun ändert offensichtlich die Änderung der Geometrie des Gegenstandes seine Geometrie, also was fehlt mir?
Gibt es eine andere Flagge, die ich einstellen sollte? Eine andere Möglichkeit, die Größe der Ellipse zu ändern, die ich verwenden sollte? Einige andere Benachrichtigungen, die ich überschreiben kann?
Zunächst ersten drei Zeilen Ihrer 'itemChange' zu' qDebug ausgetauscht werden können() << Änderung; '... Auf den zweiten, was' QGraphicsItem :: GraphicsItemChange' Wert erwarten Sie? Die nahesten Werte sind 'ItemTransformChange' und' ItemScaleChange', aber sie sind mit etwas anderem verbunden. Sie können versuchen, die Größe der Ellipse mit der Methode 'setTransform' zu ändern und eine davon zu erhalten. – ilotXXI
Ich denke, ich erwarte, dass es einen Wert in GraphicsItemChange gibt, der dies abdeckt, da es eindeutig eine Änderung der Elementgeometrie ist, und ich setze speziell das Flag, um über Änderungen an dieser Geometrie benachrichtigt zu werden. Es scheint eine eklatante Lücke in dieser Benachrichtigung zu sein, wenn nur die Position des Objekts als Teil seiner Geometrie betrachtet wird. Ich kann die Ellipse nach Herzenslust verschieben, aber es scheint keine Möglichkeit zu geben, die Größe zu ändern und benachrichtigt zu werden – Joe