Виджеты grid в PyQt5 располагаются в одном месте

Возникает проблема, что виджеты располагаются в одном месте, начале координат grid, как я понял. Как можно это решить?

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QRadioButton, QPushButton, QLabel, QGridLayout


class MainForm(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('Крестики нолики')

        self.pos = [(0, 0), (0, 1), (0, 2),
                    (1, 0), (1, 1), (2, 2),
                    (2, 0), (2, 1), (2, 2)]

        self.grid = QGridLayout(self)

        for i in range(9):
            self.button = QPushButton(self)
            self.grid.addWidget(self.button, self.pos[i][0], self.pos[i][1])

        self.setLayout(self.grid)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_form = MainForm()
    main_form.show()
    sys.exit(app.exec())

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

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

Класс QMainWindow предоставляет главное окно приложения.

Больше... https://doc.qt.io/qt-5/qmainwindow.html#details

Примечание. Создание главного окна без центрального виджета не поддерживается. У вас должен быть центральный виджет, даже если это просто заполнитель.

Попробуйте так:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
from PyQt5.QtWidgets import QRadioButton, QPushButton, QLabel, QGridLayout


class MainForm(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('Крестики нолики')
        
        self.centralWidget = QWidget()                       # +++
        self.setCentralWidget(self.centralWidget)            # +++

        self.grid = QGridLayout(self.centralWidget)          # + self.centralWidget

        for i in range(3):
            for j in range(3):                               # + j
                text = f"{i},{j}"
                button = QPushButton(text)
                button.setFixedSize(70, 70)
                button.clicked.connect(lambda ch, text=text : print(text))
                self.grid.addWidget(button, i, j) 


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_form = MainForm()
    main_form.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка