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_())