繁体   English   中英

PyQt5 QMainWindow 不显示中央小部件

[英]PyQt5 QMainWindow not displaying central widget

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

问题是即使在使用 setCentralWidget function 之后,中央小部件也没有显示在 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 function 更改了它们的背景:

注意:如果您从 QWidget 子类化自定义小部件,那么为了使用 StyleSheets,您需要为自定义小部件提供一个paintEvent:

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

不幸的是,OP声称

问题是即使在使用 setCentralWidget function 之后,中央小部件也没有显示在 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_())

笔记:

我在第一行添加了“小屋”

#!/usr/bin/python3

为了我自己的方便。

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

$ chmod a+x testQMainWindowCentralWidget.py

$ ./testQMainWindowCentralWidget.py 

并得到:

./testQMainWindowCentralWidget.py 的快照

现在, QMainWindow.setCentralWidget()按预期工作。

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

我不确定 OP 的公开代码是否是确切的复制/粘贴,而丢失的细节是否是 OP 问题的实际来源。

当我试图让它运行时,我仔细考虑了我在第一次尝试中得到的回溯,并分别逐步修复了错误,直到得到上述结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM