QMouseEvent :: localPos () и дисплей с высоким разрешением (Mac Retina) - PullRequest
0 голосов
/ 06 февраля 2019

Использование Qt 5.12, Python 3, PySide2, MacOS.

В обработчике mouseMoveEvent QMouseEvent::localPos() возвращает QPointF, но только с целочисленной точностью: цифры после десятичной точки всегда равны нулю.

Это означает, что слегка отличающиеся позиции мыши приводят к событиям с точно такими же числовыми значениями для позиции.

Я ожидаю, когда я перемещаю мышь в немного разные позиции, что-то вроде:

событие1: (4.00, 8.00)

событие2: (4.50, 8.00)

но я получаю

событие1: (4.00, 8.00)

событие2: (4.00, 8.00)

Как различить события мыши только в слегка отличающихся местах на дисплеях с высоким DPI, таких как Apple Retina?

1 Ответ

0 голосов
/ 15 марта 2019

После теста QMouseEvent::windowPos() QMouseEvent::screenPos() возвращает точность с плавающей запятой.

Следовательно, мы можем получить localPos через mapTo(mainWindow, , QPoint(0, 0)).

Код

class MyWidget : public QWidget
{
public:
  ...
  MainWindow *getMainWindow() const { return mainWindow; }
  void setMainWindow(MainWindow *win) { mainWindow = win; }

protected:
  void mouseMoveEvent(QMouseEvent *event) override
  {
    auto pos = event->windowPos();
    pos -= mapTo(getMainWindow(), QPoint(0, 0));
    qDebug() << event->localPos() << pos;
  }

private:
  MainWindow *mainWindow;
}

Результат

QPointF(2,0) QPointF(2.46875,-0.179688)
QPointF(3,0) QPointF(3.17188,0.171875)
QPointF(3,0) QPointF(3.49609,0.496094)
QPointF(4,1) QPointF(4.19922,0.847656)
QPointF(5,1) QPointF(4.52344,1.17188)
QPointF(5,1) QPointF(4.84766,1.49609)
QPointF(5,2) QPointF(5.17188,1.82031)
QPointF(5,2) QPointF(5.49609,2.14453)
QPointF(6,2) QPointF(5.82031,2.46875)
QPointF(6,3) QPointF(6.14453,2.79297)
QPointF(6,3) QPointF(6.46875,3.11719)
QPointF(7,3) QPointF(6.79297,3.44141)
QPointF(7,4) QPointF(7.11719,3.76563)
QPointF(7,4) QPointF(7.44141,3.76563)
QPointF(8,4) QPointF(7.76563,4.08984)
QPointF(8,4) QPointF(8.08984,4.41406)
QPointF(9,5) QPointF(8.79297,4.76563)
QPointF(9,5) QPointF(9.11719,5.08984)
QPointF(9,5) QPointF(9.44141,5.41406)
QPointF(10,6) QPointF(10.1445,6.11719)
...
...