Я пишу некоторый код для визуализации платы и у меня проблема с инициализацией. Я хочу создать вид, заполненный доской от начала до конца (это показано на 3-м изображении). Я пытаюсь использовать много методов Qt5, но безрезультатно (я новичок в Qt5). Вид выглядит превосходно после первого изменения размера.
Я понятия не имею, что я делаю неправильно с этой инициализацией.
Сразу после .show ():

После потери фокуса (я переключаюсь, чтобы написать этот вопрос):

После изменения размера оно становится таким, как должно выглядетьКак / что я хочу достичь: 
Как исправить этот код, чтобы он работал при инициализации формы - я 1-й уровень в Qt5 (новичок) и 7-й уровень в программировании. Возможно, нужно очень простое изменение.
Вот рабочий код Python 3.8 / Qt5:
import logging
import sys
import typing
from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import QSize, QPoint, Qt, QRect, QMargins
from PyQt5.QtGui import QFont, QPaintEvent, QPainter, QBrush, QColor, QPen
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QSizePolicy, QVBoxLayout, QHBoxLayout, QGraphicsWidget, \
QGraphicsScene, QGraphicsView, QGraphicsGridLayout, QStyleOptionGraphicsItem, QGraphicsSceneMouseEvent
class Application(QApplication):
pass
class SquareWidget(QGraphicsWidget):
def __init__(self, color):
super().__init__()
if color:
self.color = QtCore.Qt.white
else:
self.color = QtCore.Qt.black
def paint(self, painter: QtGui.QPainter, option: QStyleOptionGraphicsItem, widget: typing.Optional[QWidget] = ...) -> None:
painter.fillRect(option.rect, self.color)
class BoardContainer(QGraphicsWidget):
def __init__(self):
super().__init__()
logging.debug('size is %s for %s.', self.size(), self.__class__.__name__)
grid = QGraphicsGridLayout()
grid.setSpacing(0)
grid.setContentsMargins(0, 0, 0, 0)
self.setLayout(grid)
for row in range(8):
for column in range(8):
square_widget = SquareWidget((row + column) % 2)
grid.addItem(square_widget, row, column)
class BoardScene(QGraphicsScene):
def __init__(self):
super().__init__()
self.board_container = board_container = BoardContainer()
self.addItem(board_container)
class BoardView(QGraphicsView):
def __init__(self):
super().__init__()
logging.debug('size is %s for %s.', self.size(), self.__class__.__name__)
scene = BoardScene()
self.setScene(scene)
# no frame
self.setFrameShape(0)
# transparent background
# self.setStyleSheet('QGraphicsView {background: transparent;}')
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
def resizeEvent(self, event: QtGui.QResizeEvent) -> None:
super().resizeEvent(event)
self.fitInView(self.scene().board_container, Qt.KeepAspectRatio)
class BoardWidget(QWidget):
def __init__(self):
super().__init__()
logging.debug('size is %s for %s.', self.size(), self.__class__.__name__)
grid = QGridLayout()
board_view = BoardView()
grid.addWidget(board_view, 0, 0)
self.setLayout(grid)
def main():
# show exceptions
def excepthook(cls, exception, traceback):
sys.__excepthook__(cls, exception, traceback)
sys.excepthook = excepthook
logging.basicConfig(level=logging.DEBUG)
app = Application(sys.argv)
app.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)
default_font = QFont()
default_font.setPointSize(12)
app.setFont(default_font)
board_widget = BoardWidget()
board_widget.setMinimumSize(640, 640)
board_widget.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()