С помощью чего в форме QWidget можно нарисовать шахматное поле?
Использовала QGraphicsScene, но не очень удобно, т.к. не знаю тогда значения квадратиков, в соответствии с которыми потом буду расставлять фигурки на поле.
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Например так:
from PyQt5 import QtCore, QtGui, QtWidgets
class Square(QtWidgets.QGraphicsWidget):
def __init__(self, color):
super().__init__()
self.resize(640, 640)
self.setMinimumSize(80, 80)
if color:
self.color = QtCore.Qt.white
else:
self.color = QtCore.Qt.black
def paint(self, qp, option, widget):
qp.fillRect(option.rect, self.color)
class Scene(QtWidgets.QGraphicsScene):
def __init__(self):
super().__init__()
self.container = QtWidgets.QGraphicsWidget()
layout = QtWidgets.QGraphicsGridLayout(self.container)
layout.setSpacing(0)
self.container.setContentsMargins(0, 0, 0, 0)
layout.setContentsMargins(0, 0, 0, 0)
self.addItem(self.container)
for row in range(8):
for column in range(8):
square = Square(not (row + column) & 1)
layout.addItem(square, row, column, 1, 1)
class Chess(QtWidgets.QGraphicsView):
def __init__(self):
super().__init__()
self.resize(640, 640)
scene = Scene()
self.setScene(scene)
self.setAlignment(QtCore.Qt.AlignCenter)
self.setFrameShape(0)
# make it transparent
self.setStyleSheet('QGraphicsView {background: transparent;}')
def resizeEvent(self, event):
super().resizeEvent(event)
self.fitInView(self.scene().container, QtCore.Qt.KeepAspectRatio)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Chess()
w.show()
sys.exit(app.exec_())
