2016-10-22 7 views
0

Ich habe eine Szene in meinem Programm mithilfe von QGraphicsFramework implementiert. Also habe ich eine Form (Eltern) und seinen Ankerpunkt (Kind) beide QGraphicsItem.Wählen Sie in QGraphicsFramework sowohl das untergeordnete Element als auch das übergeordnete Element aus

Shape::Shape(QGraphicsItem *parent) : 
    QGraphicsItem(parent) 
{ 
    setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges); 
    anchorPoint = new AnchorPoint(this); 
    anchorPoint->setParentItem(this); 
    anchorPoint->setVisible(false); 
} 

Der Ankerpunkt normalerweise unsichtbar. Aber wenn ich meine Form auswähle, muss ich ihren Ankerpunkt zeigen und ihn dementsprechend ausblenden, wenn die Form die Auswahl verliert. Also habe ich diese Aktion zu itemChange gebunden:

QVariant Shape::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) 
{ 
    switch(change) 
    { 
     case QGraphicsItem::ItemSelectedChange: 
      anchorPoint->setVisible(value.toBool()); 
     break; 
    } 
    return QGraphicsItem::itemChange(change, value); 
} 

Aber das Problem erscheint, wenn ich den Ankerpunkt verschieben möchten. Wenn ich darauf klicke, verliert die Form den Fokus und versteckt ihren Ankerpunkt, so dass ich ihn nicht bewegen kann. Gibt es eine Möglichkeit, ein untergeordnetes Element auszuwählen, wenn das übergeordnete Element ausgewählt bleibt?

Antwort

1

Sie könnten Ihre eigene isSelected -Eigenschaft definieren (und den Auswahlmanager, falls Mehrfachauswahl erforderlich ist), zusätzlich zu den standardmäßig bereitgestellten Optionen, die bei Auswahl der Form auf true und auf false setzen, wenn eine andere Form ausgewählt wird Sie klicken auf die leere Szene. Der Ankerpunkt, der keine Form ist, bewirkt nicht, dass die übergeordnete Form bei der Auswahl deaktiviert wird.

Auf diese Weise können Sie die Auswahl in zwei Kontexten treffen - was die Szene als ausgewählt betrachtet und was Sie als ausgewählt betrachten. Ich habe dies in QML getan und es ist ziemlich praktisch, aber ich beziehe mich auf die benutzerdefinierte Auswahl als Fokus, die Verwendung von Griffen eines Objekts ändert die Auswahl, aber nicht den Fokus, was auch für Tastaturereignisse mit einem zusätzlichen Dispatcher nützlich ist. Ich nehme an, dass Sie möchten, dass Shape Tastaturereignisse empfängt, während der Ankerpunkt ausgewählt wird, anstatt vom Anker empfangen zu werden.

+0

Danke, @ddriver. Ich habe über diesen Weg nachgedacht. Aber ich ärgere mich darüber, dass ich einige bereits implementierte Funktionen implementieren werde. Ich spreche über die Auswahl usw. Eine andere Sache, die mich nervt ist, dass die Mehrfachauswahl in der Tat aktiviert ist. Ich kann einige Elemente in einer Szene ohne Problem auswählen. Aber ich denke immer noch, dass Ihr Vorschlag der beste Weg ist. – folibis

+0

@folibis - Qt ist riesig, aber es ist mehr auf dem "aufgeblähten" als dem "voll-proof" Ende des Spektrums. Oft funktioniert die gebotene Funktionalität nicht so, wie Sie es brauchen, manchmal kann es sogar in die Quere kommen. Oft ist der einzige Weg, es auf Ihre Art zu schaffen, es selbst zu tun. Aus diesem Grund habe ich mich trotz der schlechten Speichereffizienz für QML entschieden, da es wesentlich schneller ist als der C++ - Grafikstapel. – dtech

Verwandte Themen