3

QGraphicsRectItem で描画されたある種のヒストグラムがあります。これらの長方形には、長いものもあれば短いものもあります。長い長方形を選択しても問題ありませんが、短い長方形を選択するのは難しい場合があります。

そのため、アイテムの mousePressEvent をトリガーするカスタム領域を指定する方法があるかどうか疑問に思っていたので、長方形は同じサイズの選択領域を持つことになります。

長方形とは別に、同じ行にいくつかのテキストも描画します。何らかの方法でそれらをグループ化し、代わりにグループの mousePressEvent を記述すると便利でしょうか?

ありがとうございました!

4

1 に答える 1

3

あなたが求めているものの例の画像を見ると便利ですが、私は何を意味するか知っていると思います.

個人的には、QGraphicsItem (シグナルとスロットが必要な場合は QGraphicsObject) から継承した独自のクラスを作成するだけです。このクラスは、選択する領域を表す全領域の boundingRect() を提供できますが、paint() 関数はバーの可視部分のみを描画します。このようなもの: -

class Bar: public QGraphicsItem
{
    Q_OBJECT

    public:
        Bar(int x, int y, int width, int height, int visibleBarHeight);

        // returns the area of the object
        QRectF boundingRect() const;

        void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); 
};

ペイント関数では、可視バーの高さまで四角形を描画しますが、boundingRect では完全な四角形を返します。そうすれば、バーは目に見えて非常に小さくなりますが、オブジェクトは完全な高さになり、バーの表示領域の上のマウス選択に応答します。

テキストについては、このオブジェクトに子として追加し、選択されたときに親に通知するか、この Bar クラスの boundingRect を拡張してペイント関数でレンダリングすることができます。

boundingRect は、ローカル座標でオブジェクトによって表される領域であることに注意してください。長方形で定義されていないオブジェクトがある場合は、shape() 関数も実装する必要があります。デフォルトでは、shape() は boundingRect() を呼び出します。

于 2013-09-23T08:38:08.987 に答える