PyQt5 QMainWindow не отображает центральный виджет - PullRequest
1 голос
/ 09 мая 2020

Я хочу иметь центральный виджет с сеткой, содержащей несколько других виджетов.

проблема в том, что центральный виджет не отображается в QMainWindow даже после использования функции setCentralWidget.

здесь это код, который не работает, я не могу найти ошибку (изменить: не было никаких исключений, просто тот факт, что я не видел виджеты)

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

class Board(QWidget):
    def __init__(self):
        super().__init__()


Clock(QWidget):
    def __init__(self):
        super().__init__()

class MainGrid(QWidget):

    def __init__(self):
        super().__init__()
        self.initGrid()

    def initGrid(self):
        grid= QGridLayout()

        test = QLabel('test')
        board = Board()
        clock = Clock()
        board.setStyleSheet('background-color: pink')
        clock.setStyleSheet('background-color: blue')

        grid.addWidget(board, 2, 1, 10, 10)
        grid.addWidget(clock, 13, 4, 3, 3)

        self.setLayout(grid)


class MainWin(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        centralGrid = MainGrid()
        centralGrid.setStyleSheet('background-color: red')
        centralGrid.sizeHint()
        self.setCentralWidget(centralGrid)

        self.setGeometry(200, 100, 1000, 600)
        self.setWindowTitle('Simple Checkers')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = MainWin()
    sys.exit(app.exec_())

изменить: спасибо scheff answer Думаю, я нашел, где ошибся. для визуализации виджетов я изменил их фон с помощью функции setStyleSheet в документации Qt:

Примечание: если вы подклассифицируете пользовательский виджет из QWidget, то для использования таблиц стилей вам необходимо предоставить paintEvent для пользовательский виджет:

что касается тестовой метки, я использовал его для дальнейшего тестирования, но забыл добавить его в макет сетки, что добавило еще большей путаницы.

1 Ответ

0 голосов
/ 09 мая 2020

К сожалению, OP утверждал, что

проблема в том, что центральный виджет не отображается в QMainWindow даже после использования функции setCentralWidget.

без подробного описания.

Я внимательно посмотрел на исходный код и пришел к выводу, что

  • виджетов были добавлены в макет
  • макет установлен на виджет
  • виджет был установлен на QMainWindow.

Пока все в порядке.

Затем я скопировал полный исходный код OP в свой локальный ящик.

Чтобы заставить его работать, мне пришлось добавить / изменить множество вещей:

  1. Весь импорт Qt отсутствовал. Я добавил

    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
  2. Для sys.argvapp = QApplication(sys.argv)) также требуется import sys.

  3. Виджеты Board и Clock отсутствовали.

    #board = Board()
    #clock = Clock()
    clock = QLabel('Clock')
    #board.setStyleSheet('background-color: pink')
    
  4. test = QLabel('test') не был добавлен в макет сетки.

    grid.addWidget(test, 2, 1, 10, 10)
    

После исправления всего этого (измененный) источник был следующим:

#!/usr/bin/python3

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainGrid(QWidget):

    def __init__(self):
        super().__init__()
        self.initGrid()

    def initGrid(self):
        grid= QGridLayout()

        test = QLabel('test')
        #board = Board()
        #clock = Clock()
        clock = QLabel('Clock')
        #board.setStyleSheet('background-color: pink')
        test.setStyleSheet('background-color: pink')
        clock.setStyleSheet('background-color: blue')

        grid.addWidget(test, 2, 1, 10, 10)
        grid.addWidget(clock, 13, 4, 3, 3)

        self.setLayout(grid)


class MainWin(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        centralGrid = MainGrid()
        centralGrid.setStyleSheet('background-color: red')
        centralGrid.sizeHint()
        self.setCentralWidget(centralGrid)

        self.setGeometry(200, 100, 1000, 600)
        self.setWindowTitle('Simple Checkers')
        self.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    gui = MainWin()
    sys.exit(app.exec_())

Примечание:

Я добавил "хижину" в первой строке

#!/usr/bin/python3

для моего удобства.

Затем я запустил его в cygwin64 (потому что у меня было только Windows 10 с cygwin под рукой):

$ chmod a+x testQMainWindowCentralWidget.py

$ ./testQMainWindowCentralWidget.py 

и получил:

snapshot of ./testQMainWindowCentralWidget.py

Теперь QMainWindow.setCentralWidget() работает как положено.

Я не знаю, с какими проблемами на самом деле столкнулся OP.

Я не уверен, был ли открытый код OP точной копией / вставкой, а недостающие детали были фактическим источником проблем OP .

Когда я попытался запустить его, я внимательно рассмотрел трассировку, полученную при первых попытках, и f исправлял ошибки шаг за шагом, соответственно, пока не получил результат выше.

...