Перемещение по экрану кастомного интерфейса без стандартной панели Windows PyQt6

Мне очень понравился интерфейс, на GitHub, где автор реализует перемещение интерфейса через виджет QFrame под названием title_bar. Я решил попробовать сделать также, с поправками на PyQt6. В итоге, из-за того что в PyQt5 методы pos() и globalPos() наследуются из QMouseEvent, а в PyQt6 это QHelpEvent вся логика ломается. Кроме того в 6-ой версии PyQt эти методы вывод объекты с координатами по разной точности.

Метод отслеживания координат и перемещения окна:

    def moveWindow(event):
        if UIFunctions.returnStatus() == 1:
            UIFunctions.maximize_restore(self)

        if event.buttons() == QtCore.Qt.MouseButton.LeftButton:
            pos = self.pos()
            self.move(pos + event.globalPosition() - self.dragPos)  #ОШИБКА В ЭТОЙ СТРОЧКЕ
            self.dragPos = event.globalPosition()
            event.accept()

Метод регистрации координат мышки по нажатию:

def mousePressEvent(self, event):
    self.dragPos = event.globalPosition()

Если я меняю методы globalPos() на globalPosition() , то в конечном счёте когда я пытаюсь переместить окно, выскакивает исключение: unsupported operand type(s) for +: 'QPoint' and 'QPointF'. Как раз потому что globalPosition() возвращает QPointF. введите сюда описание изображения

А pos() возвращает QPoint

Вопрос: можно ли переписать существующий код чтобы работал на PyQt6 (переходить на 5 версию уже поздно), либо проще сделать такую логику с нуля свою? Мне кажется что достаточно будет перевести в QPoint в QPointF


Ответы (2 шт):

Автор решения: S. Nick

Я не могу проверить, но предложу попробовать (добавьте перед self.move(...)) :

print(f'QPointF --> QPoint: {QPoint(event.globalPosition().x(), event.globalPosition().y())}')

или

print(f'QPointF --> QPoint: {QPoint(int(event.globalPosition().x()), int(event.globalPosition().y()))}')

С self.dragPos, если что, надо проделать тоже самое.

P.S. Также почитайте https://www.qt.io/blog/input-events-in-qt-6 может что-то интересное найдете.

→ Ссылка
Автор решения: AddmiX

В общем, решение очень простое лично для себя я подобрал. Просто применив метод toPoint() алгоритм работает:

    def moveWindow(event):
        if event.buttons() == QtCore.Qt.MouseButton.LeftButton:
            pos = self.pos()
            glpos = event.globalPosition().toPoint()
            self.move(pos + glpos - self.dragPos.toPoint())
            self.dragPos = event.globalPosition()
            event.accept()
→ Ссылка