2016-10-22 3 views
0

Я реализовал сцену в своей программе с помощью QGraphicsFramework. Итак, у меня есть форма (родительская) и ее опорная точка (ребенок) и QGraphicsItem.Выберите дочерний элемент и его родительский элемент в QGraphicsFramework

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

Позиция якорной точки, обычно невидимая. Но когда я выбираю свою форму, я должен показать свою опорную точку и, соответственно, скрыть ее, когда форма теряет выделение. Так что я обязан это действие, чтобы itemChange:

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

Но проблема возникает, когда я хочу, чтобы переместить точку привязки. Если я нажму на нее, то форма теряет фокус и, таким образом, скрывает ее опорную точку, поэтому я не могу ее переместить. Есть ли способ выбрать дочерний элемент, когда его родитель остается выбранным?

ответ

1

Вы можете определить собственное свойство isSelected (и менеджер выбора, если требуется несколько выборок), поверх того, что предоставляется по умолчанию, которое установлено в true при выборе Shape и false, если выбрана другая форма Shape или вы щелкните пустую сцену. Якорная точка, не являющаяся Shape, не приведет к тому, что родительская форма будет отменена, когда она будет выбрана.

Таким образом, вы можете выбрать выделение в двух контекстах - то, что сцена считает выбранным, и то, что вы считаете выбранным. Я сделал это в QML, и это довольно удобно, однако я ссылаюсь на пользовательский выбор в качестве фокуса, используя дескрипторы объекта, изменяющего выбор, но не фокус, что полезно для событий клавиатуры с дополнительным диспетчером, потому что я предполагаю, что вы также захотите, чтобы Shape получал события клавиатуры, пока выбранная точка привязки выбрана, а не принимается якорем.

+0

Спасибо, @ddriver. Я думал об этом. Но я немного раздражаю, что я собираюсь реализовать некоторые функциональные возможности, которые уже реализованы. Я говорю об отборе и т. Д. Еще одна вещь, которая меня раздражает, заключается в том, что на самом деле включен множественный выбор. Я могу выбрать пару предметов в сцене без проблем. Но я все же думаю, что ваше предложение - лучший способ. – folibis

+0

@folibis - Qt огромен, но он больше похож на «раздутый», чем «полный доказательство» конца спектра. Много раз предоставляемая функциональность не работает так, как вам это нужно, иногда это может даже мешать. Часто единственный способ добиться этого - сделать это самостоятельно. Вот почему я пошел на QML, несмотря на плохую эффективность памяти, гораздо быстрее делать такие вещи, чем стек C++. – dtech

 Смежные вопросы

  • Нет связанных вопросов^_^