PyQt5 QMainWindow 不显示中央小部件

PyQt5 QMainWindow not displaying central widget

我想要一个中央小部件,其网格布局包含多个其他小部件。

问题是即使在使用 setCentralWidget 函数后中央小部件也没有显示在 QMainWindow 上。

这是无效的代码,我找不到错误(编辑:没有引发异常,只是我看不到小部件)

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 的回答,我想我找到了哪里出错了。 为了可视化小部件,我使用 setStyleSheet 函数更改了它们的背景,在 Qt 文档中:

Note: If you subclass a custom widget from QWidget, then in order to use the StyleSheets you need to provide a paintEvent to the custom widget :

至于测试标签,我将其用于进一步测试,但忘记将其添加到网格布局中,这增加了更多的混乱。

不幸的是,OP 声称

the problem is that the central widget is not showing on QMainWindow even after using setCentralWidget function .

不详述。

我粗略地查看了来源并得出结论

  • 小部件已添加到布局
  • 布局设置为小部件
  • 小部件已设置为 QMainWindow

到目前为止一切顺利。

然后我把OP的完整源码复制到我的本地盒子里

为了做到 运行 我必须 add/modify 做很多事情:

  1. 所有 Qt 导入都丢失了。我加了

    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
  2. 对于sys.argv(在app = QApplication(sys.argv)中),也需要import sys

  3. 缺少小部件 BoardClock

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

注:

我在第一行添加了"hut"

#!/usr/bin/python3

为了我自己的方便。

然后我 运行 它在 cygwin64 中(因为我手头只有 Windows 10 个 cygwin):

$ chmod a+x testQMainWindowCentralWidget.py

$ ./testQMainWindowCentralWidget.py 

并得到:

现在,QMainWindow.setCentralWidget() 按预期运行。

我不知道 OP 实际上 运行 在哪个问题中。

我不确定公开的 OP 代码是否准确copy/paste,缺少的细节才是 OP 问题的真正根源。

我在尝试做的时候运行仔细考虑了第一次尝试得到的回溯,一步步修复bug,直到得到上面的结果。