QMouseEvent для одиночного движения - PullRequest
0 голосов
/ 22 октября 2018

Почему Qt событие движения мыши пропускает несколько событий для одного движения?

Вот простой проект.

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <fstream>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    // handle the pressing event to track the starting of the moving event
    void mousePressEvent(QMouseEvent* ev);
    void mouseMoveEvent(QMouseEvent* ev);
    // handle the releasing event to track the end of the moving event
    void mouseReleaseEvent(QMouseEvent* ev);

private:
    std::ofstream fout; // open the file "debug.txt"
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    fout.open("debug.txt"); // open the output file
}

MainWindow::~MainWindow()
{
    fout.close(); // close the file when program closed
}

void MainWindow::mousePressEvent(QMouseEvent *ev)
{
    ev->accept();
    fout << "pressed at (" << ev->x() << ',' << ev->y() << ')' << std::endl;
}

void MainWindow::mouseMoveEvent(QMouseEvent *ev)
{
    ev->accept();
    fout << "moved to (" << ev->x() << ',' << ev->y() << ')' << std::endl;
}

void MainWindow::mouseReleaseEvent(QMouseEvent *ev)
{
    ev->accept();
    fout << "released at (" << ev->x() << ',' << ev->y() << ')' << std::endl;
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

результат «debug.txt» заканчивается следующим содержанием:

pressed at (106,26)
moved to (106,26)
moved to (105,26)
moved to (105,26)
released at (105,26)

Я уверен, что осторожно переместил своймышь, чтобы убедиться, что моя мышь была перемещена только на один пиксель, но провайдером событий Qt передано 3 события.Если кто-то может объяснить причину, будет хорошей помощью.

1 Ответ

0 голосов
/ 22 октября 2018

Это происходит потому, что позиция мыши опрашивается без учета координат, особенно экранных координат курсора.Это опрошено, надеюсь, периодическим образом.В действительности, координаты мыши являются относительными и измеряются в единицах измерения, меньших одного миллиметра (или пикселя на экране).После преобразования трех отдельных положений мыши в пиксели, вы получили одинаковые координаты трижды.

...