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 做很多事情:
所有 Qt 导入都丢失了。我加了
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
对于sys.argv
(在app = QApplication(sys.argv)
中),也需要import sys
。
缺少小部件 Board
和 Clock
。
#board = Board()
#clock = Clock()
clock = QLabel('Clock')
#board.setStyleSheet('background-color: pink')
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,直到得到上面的结果。
我想要一个中央小部件,其网格布局包含多个其他小部件。
问题是即使在使用 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 做很多事情:
所有 Qt 导入都丢失了。我加了
from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
对于
sys.argv
(在app = QApplication(sys.argv)
中),也需要import sys
。缺少小部件
Board
和Clock
。#board = Board() #clock = Clock() clock = QLabel('Clock') #board.setStyleSheet('background-color: pink')
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,直到得到上面的结果。