首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt5 QMainWindow没有显示中央小部件

PyQt5 QMainWindow没有显示中央小部件
EN

Stack Overflow用户
提问于 2020-05-09 11:37:56
回答 1查看 1.1K关注 0票数 1

我希望有一个具有包含多个其他小部件的网格布局的中央Widget。

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

下面是不起作用的代码,我找不到错误(编辑:没有引发异常,只是没有看到小部件)

代码语言:javascript
复制
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_())

编辑:多亏了谢夫的回答,我想我找到了我做错的地方。为了可视化这些小部件,我在Qt文档中使用setStyleSheet函数改变了它们的背景:

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

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

EN

Stack Overflow用户

回答已采纳

发布于 2020-05-09 12:47:09

不幸的是,“任择议定书”声称

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

没有详细说明。

我粗略地看了一下消息来源,得出的结论是

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

到目前为止还不错。

然后,我将OP的全部源代码复制到本地框中。

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

  1. 所有Qt进口都丢失了。我加了 从PyQt5.QtCore导入*来自PyQt5.QtGui导入*来自PyQt5.QtWidget导入*
  2. 对于sys.argv (在app = QApplication(sys.argv)中),import sys也是必需的。
  3. 小部件BoardClock丢失了。 #board = Board() #clock = Clock() clock = QLabel('Clock') #board.setStyleSheet(‘背景颜色:粉红色’)
  4. test = QLabel('test')没有添加到网格布局中。 Grid.addWidget(测试,2,1,10,10)

在修复了所有这些之后,(修改的)源如下:

代码语言:javascript
复制
#!/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_())

注:

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

代码语言:javascript
复制
#!/usr/bin/python3

为了我自己的方便。

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

代码语言:javascript
复制
$ chmod a+x testQMainWindowCentralWidget.py

$ ./testQMainWindowCentralWidget.py 

并得到:

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

我不知道行动小组到底遇到了哪些问题。

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

当我试图使它运行时,我仔细考虑了我在第一次尝试中得到的跟踪,并逐步修复了bug,直到得到上述结果。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61696146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档