PyQt5 QMainWindow不显示中央小部件

问题描述 投票:1回答:1

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

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

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

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

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:

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

python qt qwidget qmainwindow qgridlayout
1个回答
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问题的真正根源。

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

© www.soinside.com 2019 - 2024. All rights reserved.