2016-08-21 2 views
0

Я использую Qt 5.7 (последняя версия). Я не могу заставить события мыши работать в QGraphicsScene, но они работают в окне вне моей сцены. Я следовал за этим question.События мыши Qt не работают в QGraphicsScene

Так я перезаписаны QWidget::mouseMoveEvent() в подклассе моего главного виджета, как это:

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

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

void MyWidget::mouseMoveEvent(QMouseEvent * event) { 

} 

Это не работает: mouseMoveEvent, mouseGrabber, mousePressEvent, mouseReleaseEvent или mouseDoubleClickEvent. Но почему-то это работает только для 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 Тогда я определить этот метод в 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.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

Я уверен, что он включен. Когда я запустил этот код if (hasMouseTracking()) {qDebug() << "true";} Он возвращает true –

+0

Не могли бы вы разместить свой источник? – hyun

+0

Уверен, всего лишь секунд –

Смежные вопросы