Qt разное поведение при разворачивании окна

Используя PyQt или PySide на ОС Debian 11 с DE Gnome 3.38, заметил неправильное поведение при разворачивании окна двойным щелчком по заголовку. Перестает правильно работать приложение, а именно перестают работать смена курсоров и установленные свойства QGraphicsView (например self.setTransformationAnchor()) до момента пока курсор мыши не будет выведен за пределы представления и обратно.

Если окно развернуть программно или на кнопку разворачивания, то все работает правильно.

Знает ли кто-нибудь с чем это связано и как это исправить?

Управление в примере:

  • Наведение на Item(красный квадрат) - смена курсора.
  • Нажатие на сцене средней кнопкой мыши - смена курсора.
  • Нажатие правой кнопкой мыши на сцене - программное разворачивание окна, повторное нажатие возвращает к начальному состоянию окна
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import sys

from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QStyle, QGraphicsScene, QGraphicsView, QWidget, QVBoxLayout, \
    QGraphicsRectItem


class MyItem(QGraphicsRectItem):
    def __init__(self):
        super(MyItem, self).__init__()

        self.setRect(0, 0, 100, 100)
        self.setBrush(Qt.red)
        self.setCursor(Qt.SizeAllCursor)


class MyView(QGraphicsView):
    def __init__(self, scene, wnd: QMainWindow):
        super(MyView, self).__init__()

        self.wnd = wnd
        self.setScene(scene)
        self.setRenderHints(
            QPainter.Antialiasing
            | QPainter.HighQualityAntialiasing
            | QPainter.TextAntialiasing
            | QPainter.SmoothPixmapTransform
        )
        self.setTransformationAnchor(QGraphicsView.NoAnchor)

        self.state_size = False

    def mousePressEvent(self, event):
        super(MyView, self).mousePressEvent(event)
        if event.buttons() == Qt.MiddleButton:
            self.viewport().setCursor(Qt.ClosedHandCursor)
        if event.buttons() == Qt.RightButton:
            if not self.state_size:
                self.wnd.showMaximized()
                self.state_size = True
            else:
                self.wnd.showNormal()
                self.state_size = False

    def mouseReleaseEvent(self, event):
        super(MyView, self).mouseReleaseEvent(event)
        self.viewport().unsetCursor()


class MyScene(QGraphicsScene):
    def __init__(self):
        super(MyScene, self).__init__()

        self.sceneWidth = 1000
        self.sceneHeight = 1000
        self.colorBackground = QColor("#888888FF")
        self.setBackgroundBrush(self.colorBackground)
        # self.setSceneRect(~self.sceneWidth // 2, ~self.sceneHeight // 2,
        #                   self.sceneWidth, self.sceneHeight)

    def drawBackground(self, painter, rect):
        super(MyScene, self).drawBackground(painter, rect)


class MyEditor(QWidget):
    def __init__(self, wnd: QMainWindow):
        super(MyEditor, self).__init__()

        self.my_scene = MyScene()
        self.my_view = MyView(self.my_scene, wnd)
        self.setLayout(QVBoxLayout())
        self.layout().addWidget(self.my_view)
        self.my_scene.addItem(MyItem())


if __name__ == '__main__':
    app = QApplication(sys.argv)

    wnd = QMainWindow()
    wnd.setGeometry(QStyle.alignedRect(Qt.LeftToRight,
                                       Qt.AlignCenter,
                                       QSize(800, 600),
                                       QApplication.desktop().availableGeometry()))
    wnd.setCentralWidget(MyEditor(wnd))
    wnd.show()

    sys.exit(app.exec_())


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