web-dev-qa-db-ja.com

QGraphicsSceneクラスでのマウスの動きの追跡

QGraphicsSceneをサブクラス化し、マウス移動イベントを処理するためのメソッドmouseMoveEventを追加しました。 GraphicsViewの上にルーラーを作成し、ルーラーにマウスの動きを追跡させました。 QGraphicsScene :: mouseemoveEventで、ルーラーウィジェットのmouseMoveEventを明示的に呼び出します。目的は、現在のマウスの位置を定規に知らせることです。

マウスを動かしてもQGraphicsScene :: mousemoveEventが呼び出されないようです。ただし、マウスの左ボタンを押しながらボタンを押したまま動かすと動作します。これは私が見たいものではありません。ビューの上にマウスを置いてマウスを動かすたびに、このメソッドが呼び出されるようにしたいと思います。

回避策はありますか?

19
cuteCAT

QGraphicsView ドキュメントに記載されているように、ビューはマウスとキーボードのイベントをシーンイベントに変換し、それをシーンに伝播する役割を果たします。

マウスとキーボードを使用して、シーン上のアイテムを操作できます。 QGraphicsViewは、マウスイベントとキーイベントをシーンイベント(QGraphicsSceneEventを継承するイベント)に変換し、視覚化されたシーンに転送します。

マウス移動イベント はデフォルトでボタンが押されたときにのみ発生するため、最初に生成される移動イベントのビューで setMouseTracking(true) する必要がありますそれらをシーンに転送できるように配置します。
または、シーン座標への変換が必要ない場合は、シーンではなくビューにmouseMoveEventを直接再実装できます。ただし、この場合は、必ず基本クラスを呼び出すようにしてください QGraphicsView::mouseMoveEvent 実装で、シーン内のアイテムに対してホバーイベントが適切に生成されるようにします。

12
Mat

私は尋ねてきました、そしてどこかでいくつかの有用な情報を見つけました、そしてテストはこれを書きます:

tgs.cpp

#include <QtGui>
#include "tgs.h"
#define _alto  300
#define _ancho 700
#include <QGraphicsSceneMouseEvent>

TGs::TGs(QObject *parent)
    :QGraphicsScene(parent)
{ // Constructor of Scene
    this->over = false;
}

void TGs::drawBackground(QPainter *Painter, const QRectF &rect)
{

#define adjy 30
#define adjx 30

    int j = 0;
    int alto = 0;

    QPen pen;
    pen.setWidth(1);
    pen.setBrush(Qt::lightGray);
    Painter->setPen(pen);   

    Painter->drawText(-225, 10, this->str);
    alto = _alto;  // 50 + 2

    for(int i = 0; i < alto; ++i)
    {
        j = i * adjy - 17;

        Painter->drawLine(QPoint(-210, j), QPoint(_ancho, j));
    }

    for(int i = 0; i < 300; ++i)
    {
        j = i * adjx - 210;

        Painter->drawLine(QPoint(j, 0), QPoint(j, _ancho * 2));
    }
}

void TGs::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    QString string = QString("%1, %2")
               .arg(mouseEvent->scenePos().x())
              .arg(mouseEvent->scenePos().y()); // Update the cursor position text
    this->str = string;
    this->update();
}

void TGs::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    this->update();
}

void TGs::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    this->update();
}

tgs.h

#ifndef TGS_H
#define TGS_H

#include <QObject>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsTextItem>

QT_BEGIN_NAMESPACE

class QGraphicsSceneMouseEvent;
class QMenu;
class QPointF;
class QGraphicsLineItem;
class QFont;
class QGraphicsTextItem;
class QColor;

QT_END_NAMESPACE

class TGs : public QGraphicsScene
{
public:
    TGs(QObject *parent = 0);

public slots:
    void drawBackground(QPainter *Painter, const QRectF &rect);
    void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

    bool over;
    QString str;
    QGraphicsTextItem cursor;
};

#endif // TGS_H
2
user2223585