2016-08-21 4 views
0

Qt 5.7 (최신 버전)을 사용하고 있습니다. QGraphicsScene에서 마우스 이벤트를 작동시킬 수는 없지만 장면 외부의 창에서 작업합니다. 나는이 question.QGraphicsScene에서 Qt 마우스 이벤트가 작동하지 않습니다.

그래서 나는이 같은 내 주요 위젯의 하위 클래스에서 QWidget::mouseMoveEvent()을 덮어했다 따랐다 : mouseMoveEvent, mouseGrabber, mousePressEvent, mouseReleaseEvent, 또는 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()으로 마우스 추적을 설정하지 않으면 마우스 버튼을 눌렀을 때만 발생합니다.

그래서, 난 당신이 mouseTracking정말가`bool hasMouseTracking() const를 사용하여 사용 가능 여부를 확인한다고 생각합니다.

+0

(hasMouseTracking()) {qDebug() << "true";}이 코드를 실행하면 true가 반환됩니다. –

+0

소스를 게시 할 수 있습니까? – hyun

+0

잠깐만. –