2016-10-22 2 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、別のシェイプが選択されている場合はfalseに設定されます。空のシーンをクリックします。 Shapeではないアンカーポイントでは、親シェイプが選択されても選択解除されません。

この方法では、シーンが選択したと考えられるものと選択したものの2つのコンテキストで選択を行うことができます。私はこれをQMLで行いましたが、これは非常に便利ですが、私はカスタム選択をフォーカスと呼んでいます。オブジェクトのハンドルを使用すると選択が変更されますがフォーカスは使用されず、ディスパッチャを追加したキーボードイベントにも便利です。なぜなら、Anchorによって受け取られるのではなく、アンカーポイントが選択されている間にShapeがキーボードイベントを受け取るようにしたいと思うからです。

+0

ありがとう、@ddriver。私はこの方法について考えてきました。しかし、私はすでに実装されているいくつかの機能を実装しようとしているのはちょっと面倒です。私は選択などについて話しています。私を悩ます別のことは、複数の選択が実際に有効になっていることです。私は問題のないシーンでいくつかのアイテムを選択できます。しかし、私はまだあなたの提案が最良の方法だと思っています。 – folibis

+0

@folibis - Qtは巨大ですが、スペクトルの「完全保証型」端よりも「肥大化」しています。提供された機能は、必要なときには機能しませんが、他の方法でも機能します。それをあなたの方法で得るための唯一の方法は、自分で行うことです。だから私はQMLのために貧しいメモリ効率にもかかわらず、それははるかに高速ですC + +のグラフィックスのスタックよりもそうです。 – dtech

関連する問題