2017-02-22 35 views
0

私はカスタムウィジェットをドラッグしているうちに、マウスをQScrollAreaの中に「止め」たいと思っています。私はMyScrollAreaというサブクラスをQScrollAreaにしましたので、イベントmouseMoveEventを再実装することができました。これはMyScrollAreaサブクラスです:Qt 5.7ウィジェット内のマウス移動を制限する方法

myscrollarea.h

#ifndef MYSCROLLAREA_H 
#define MYSCROLLAREA_H 

#include <QScrollArea> 
#include <QDebug> 
#include <QtGui> 

class MyScrollArea : public QScrollArea 
{ 
    Q_OBJECT 
public: 
    explicit MyScrollArea(QWidget *parent = 0); 

signals: 
    void changeLabel(QString); 

public slots: 

protected: 
    void leaveEvent(QEvent *event); 

    void mouseMoveEvent(QMouseEvent *event); 

private: 
    int mouseX, mouseY; 
}; 

#endif // MYSCROLLAREA_H 

myscrollarea.cpp

ボタンがあるとき
#include "myscrollarea.h" 

MyScrollArea::MyScrollArea(QWidget *parent) 
    : QScrollArea(parent) 
{ 
    this->setMouseTracking(true); 
    mouseX = 0; 
    mouseY = 0; 
} 

void MyScrollArea::leaveEvent(QEvent *event) 
{ 
    qDebug() << "LEFT!"; 
} 

void MyScrollArea::mouseMoveEvent(QMouseEvent *event) 
{ 
    mouseX = event->x(); 
    mouseY = event->y(); 
    event->accept(); 
    emit changeLabel(QString::number(mouseX) + ", " + QString::number(mouseY)); 
} 

は、マウストラッキングがtrueに設定されているにもかかわらず、私はmouseMoveEventを取得するために管理します開催されました。

私の質問は:

  1. 私はすべての動きにmouseMoveEventトリガーを作るにはどうすればよいですか?
  2. 作成したカスタムウィジェットをドラッグしているときに、カーソルを最後の位置(「QScrollArea」内)に設定するにはどうすればよいですか?
+0

あなたはmousePressEventとmouseReleaseEventを実装しようとしたことがありますか? – eyllanesc

+0

実際にはありません。しかし、ウィジェットをQScrollAreaの外に移動させないようにカスタムウィジェットを "つかむ"とき(ドラッグするとき)カーソルの位置が必要です。 mousePressとmouseReleaseを使ってどうすればいいですか?私はちょうどどこかをクリックすると、マウスの押下も有効にならないでしょうか? – andseg

+0

try with eventFilter – eyllanesc

答えて

0

何EventFilterを使用してはどうですか?手順:

はウィジェットでevent filterをインストールします。

this->setMouseTracking(true); 
this->installEventFilter(this); 

eventFilter機能を再実装:

bool MyScrollArea::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (obj == this) { 
     if(event->type() == QEvent::MouseMove) { 
      QMouseEvent *mEvent = (QMouseEvent*)event; 
      // Use something like the viewPortSize to handle if the pos event is inside 
      if (over) { 
        // Mouse over Widget 
      } else { 
        // Mouse outside 
      } 
     } 
    } else { 
     return QScrollArea::eventFilter(obj, event); 
    } 
} 
+0

これは良いアイデアです。 eyllanescが指摘するように。しかし、 'mouseTracking'が正しく動作しないので' event-> type() 'が' QEvent :: MouseMove'かどうかわかりません。繰り返しますが、これは私の2番目の問題を解決しますが、最初の問題は解決しません。 – andseg

関連する問題