2016-03-25 8 views
1

ので、私は同様の質問のかなり多くがここにあります知っているが、どれも本当に私が興味を持って特定のポイントに到達していない。QGraphicsscene:QGraphicsItemsの(ゴムバンドによる)選択を実装する方法は?

私はQGraphicsItem Sのカスタム選択動作を実装する(例えば選択にその色を変更します)。どうやらこれはアイテム自体によって処理されるため、QGraphicsItemを拡張する独自のクラスを作成する必要があります。そこに、私は実際には、onSelectionToggledメソッド(スロット)のように、何かを無効にすることができます。しかし、最後に、mousePressEventメソッドをオーバーライドする必要があることを理解しました(すべての「選択」は、左クリックの抽象概念のより具体的な用語です)。だから、

この方法では、私が呼び出した場合:

setPen(QPen(QColor("orange"))); 
    update(); 

私は単一の項目をクリックすると、色が実際に変化します。 しかし、シーンのラバーバンドを介して選択が行われたときは、 onSelectionToggledがないので、シーンが交差したアイテムのそれぞれのマウスイベントを「シミュレート」すると思いました。

これは当てはまらないので、私の質問は「どのようにラバーバンドを介してそのような選択肢に反応できますか?」です。理想的には、 "統一された"方法(マウスクリックによる個々の選択のための特別なコードなし)。

また、点線で囲まれた境界矩形が選択範囲に描画されないようにする方法もあります。私はそれを望んでおらず、QGraphicsItemをサブクラス化するときにそれを自動的に取り除くことを望んでいました。

+0

大きな質問ではなく、点線の四角形については、QStyle :: drawPrimitive' ... – IAmInPLS

+0

@AlexisPを再実装する必要があります。真剣に? QStyleはQGraphicsScene :: setStyleですべて使用できる多くの派生クラスを持つ抽象クラスですから、私はこれらのクラスをすべてサブクラス化してdrawPrimitiveメソッドをオーバーライドする必要があるようです。または、QStyleのサブクラスを1つだけ選択しますが、シーンのスタイルに適応する能力が失われます。 KDE、Mac OS、またはWindows(QStyleは実際には、私が見る限り)で動作します。 –

答えて

1

QGraphicsItemクラスは、QGraphicsSceneのすべてのグラフィックアイテムの基本クラスです。 QGraphicsSceneクラスには、QGraphicsItemの選択を処理するためのすべての機能が含まれています。あなたは信号QGraphicsScene::selectionChanged()をキャッチした場合、あなたはそれらの項目のペンを変更して再描画することができます

`QList<QGraphicsItem *> QGraphicsScene::selectedItems()` 

て選択した項目を見つけることができるはずです。

もちろん、アイテムが選択されていなければアイテムを元の色に戻したいので、すべてのアイテム(QList<QGraphicsItem *> QGraphicsScene::items())を繰り返して、​​状態を確認してペンを適切な色に変更してください。

+0

この便利な答えをありがとう。すべてのアイテムに対する繰り返しとそれらが個別に選択されているかどうかを確認することは、本当に私にとって適切なアプローチでした(私は「非選択」イベントも処理したいので)。 MVCパターンの精神で、QGraphicsscne(モデルとして)とQGraphicsView(ビューとして)へのポインタを持つコントローラクラスにコードを入れました。 Qt docuが明示的に項目の動的な振る舞いを実装するように指示しているので、ちょっと気が気になりません... –

関連する問題