Почему виджет дрожит, когда я перемещаю мышь?

Как можно улучшить скорость и плавность перемещения объекта при использовании методов `mousePressEvent`, `mouseMoveEvent` и `mouseReleaseEvent`, чтобы исключить его дрожание и увеличить скорость перемещения? Вот пример кода для вашего класса, который может помочь вам решить эту проблему.
  • 20 августа 2024 г. 11:03
Ответы на вопрос 2
Дрожание виджета при перемещении мыши может возникать из-за того, что обновление позиции объекта происходит не слишком часто или не всегда равномерно. Для улучшения скорости и плавности перемещения объекта при использовании методов `mousePressEvent`, `mouseMoveEvent` и `mouseReleaseEvent`, рекомендуется использовать QTimer для обновления позиции объекта равномерно и с заданной скоростью.

Также важно правильно обрабатывать события мыши, чтобы они не передавались излишне часто или неправильно. Вот простой пример кода, который демонстрирует улучшение скорости и плавности перемещения объекта:

```python
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt, QTimer

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.setFixedSize(100, 100)
        self.setMouseTracking(True)

        self.timer = QTimer()
        self.timer.timeout.connect(self.updatePosition)
        self.speed = 5

        self.startPos = None

    def mousePressEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            self.startPos = event.pos()
            self.timer.start(20)

    def mouseMoveEvent(self, event):
        if self.startPos:
            self.move(self.mapToParent(event.pos() - self.startPos))

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.timer.stop()
            self.startPos = None

    def updatePosition(self):
        currPos = self.pos()
        newPos = currPos + self.speed * self.dir
        self.move(newPos)

if __name__ == '__main__':
    app = QApplication([])
    widget = MyWidget()
    widget.show()
    app.exec()
```

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

Этот пример кода может быть доработан и оптимизирован под ваши конкретные потребности и требования.
Причина оказалась в относительных координатах курсора. Корректные координаты получаются только если вызывать event->globalPosition() .
Похожие вопросы