2011-10-14 21 views
17

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

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

回避策はありますか?

+4

[OK]を、私は見つけます。 QGraphicsViewでmouseTrackingを有効にする必要があります。それをした後、それは魅力のように動作します。 – cuteCAT

+4

だから質問に答えて答えを受け入れる – Dmitriy

+0

@SherwoodHu geotavrosが言ったように、あなた自身の質問に答えてそれを受け入れるべきです。ここでは完全に有効な方法です。 –

答えて

9

QGraphicsViewドキュメントで述べたように、ビューはシーンのイベントにマウスとキーボードのイベントを翻訳し、シーンにそれを伝播するための責任がある:

あなたがマウスを使って、シーン上の項目と対話することができますキーボード。 QGraphicsViewは、マウスイベントとキーイベントをシーンイベント(QGraphicsSceneEventを継承するイベント)に変換し、視覚化されたシーンに転送します。 mouse move events以来

はボタンがデフォルトで押されたとき、それはシーンにそれらを転送することができるように、あなたは、最初の場所で生成するには、MoveイベントのビューにsetMouseTracking(true)する必要が生じます。
また、シーン座標への変換が不要な場合は、シーン内ではなくビュー内でmouseMoveEventを直接再実装できます。ただし、この場合は、実装の基本クラスQGraphicsView::mouseMoveEventを呼び出して、シーン内の項目のホバーイベントが正しく生成されるようにしてください。

2

私が尋ねると、いくつかの場所でいくつかの有用な情報を発見し、そしてテストは、この書き込みをしてきた:

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 
関連する問題