2016-08-21 19 views
0

Qt 5.7(最新バージョン)を使用しています。私はQGraphicsSceneで動作するマウスイベントを取得することはできませんが、彼らは私のシーンの外のウィンドウで動作します。私はこのquestion.QGraphicsSceneでQtマウスイベントが機能しない

は、だから私はこのように私のメインのウィジェットのサブクラスでQWidget::mouseMoveEvent()を上書きしている続いている:mouseMoveEventmouseGrabbermousePressEventmouseReleaseEvent、またはmouseDoubleClickEvent

// header: 
class MyWidget { 
    ... 
    void mouseMoveEvent(QMouseEvent * event); 
}; 

// source: 
MyWidget::MyWidget() { 
    setMouseTracking(); 
} 

void MyWidget::mouseMoveEvent(QMouseEvent * event) { 

} 

それは動作しません。しかし、どういうわけか、それはmousePressEventのためだけに機能します。

これはQtのバグでしょうか?

ソースコードは:objectloader.cppで

ObjectLoader::ObjectLoader(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::ObjectLoader) 
{ 
    ui->setupUi(this); 
    scene=new QGraphicsScene(this); 
    ui->graphicsView->setScene(scene); 
    ui->graphicsView->setMouseTracking(true); 
    setMouseTracking(true); 



} 

厥は、私は、私はobjectloader.h

class ObjectLoader : public QMainWindow 
{ 
    Q_OBJECT 


    public: 
     explicit ObjectLoader(QWidget *parent = 0); 
     ~ObjectLoader(); 

    private slots: 
    void mouseMoveEvent(QMouseEvent *event); 
    protected: 

    private: 

    }; 

    #endif // OBJECTLOADER_H 

でそのメソッドを定義回 objectloader.h でマウストラッキングを設定しました。そして、objectloader.cppでのそのメソッドの実装

void ObjectLoader::mouseMoveEvent(QMouseEvent *event){ 

    qDebug()<<"Mouse moved"; 

} 

答えて

3

マウスイベントがQtによって生成されると、一般に、イベントが生成されたときにマウスポインタの下にあったQWidgetに最初に渡されます。そのQWidgetacceptsイベントの場合、それ以上の処理は行われません。 のイベントがでない場合、QtはそのイベントをそのQWidgetの親に伝えるかもしれません。

あなたが興味を持っているマウスの移動イベントは、受け入れ中のQGraphicsView/QGraphicsSceneの参加者に送信され、それ以上の処理は行われません。そのような場合には、一般に興味のあるイベントをインターセプトして処理するためにevent filterをインストールする必要があります。

1

マウスの移動イベントは、QWidget :: setMouseTracking()でマウスの追跡が有効になっていない限り、マウスボタンが押されたときにのみ発生します。

だから、私はあなたが​​はが本当には `bool hasMouseTracking() constを使用することにより、有効であるかどうかを確認するべきだと思います。

+0

私はこのコードを実行すると(hasMouseTracking()){qDebug()<< "true";} trueを返します –

+0

ソースを投稿できますか? – hyun

+0

確かにちょっと –

関連する問題