PyQt5 QMainWindow不显示中央小部件

时间:2020-05-09 11:37:56

标签: python qt qwidget qmainwindow qgridlayout

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

问题在于,即使使用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的回答,我认为我发现了我出了错。 可视化我在Qt文档上使用setStyleSheet函数更改背景的小部件:

注意:如果您从QWidget继承了自定义小部件,则为了使用StyleSheets,您需要向自定义小部件提供paintEvent:

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

1 个答案:

答案 0 :(得分:0)

不幸的是,OP声称

问题在于,即使使用setCentralWidget函数后,中央窗口小部件也不会显示在QMainWindow上。

没有详细说明。

我粗略看了一下资料来源,得出的结论是

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

到目前为止很好。

然后,我将完整的OP源复制到本地框中。

要使其运行,我必须添加/修改各种内容:

  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中运行了它(因为我手头只有cygwin的Windows 10):

$ chmod a+x testQMainWindowCentralWidget.py

$ ./testQMainWindowCentralWidget.py 

并得到:

snapshot of ./testQMainWindowCentralWidget.py

现在,QMainWindow.setCentralWidget()可以正常工作了。

我不知道OP实际遇到了哪些问题。

我不确定OP的公开代码是否准确地复制/粘贴了,丢失的详细信息是否是OP问题的真正根源。

当我试图使其运行时,我仔细考虑了第一次尝试中得到的追溯,并逐步解决了这些错误,直到获得上述结果为止。