我想要一个中央小部件,其网格布局包含多个其他小部件。
问题是,即使使用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:
至于测试标签,我将其用于进一步的测试,但忘记将其添加到网格布局中,这更加增加了混乱。
不幸的是,OP声称
问题是,即使使用setCentralWidget函数,中央小部件也未显示在QMainWindow上。
没有详细说明。
我对来源进行了粗略的调查,得出的结论是
QMainWindow
。到目前为止一切顺利。
然后我将OP的完整源复制到了本地机器。
要使其运行,我必须添加/修改各种内容:
所有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中运行了它(因为我手头只有cygwin的Windows 10):
$ chmod a+x testQMainWindowCentralWidget.py
$ ./testQMainWindowCentralWidget.py
并且得到:
现在,QMainWindow.setCentralWidget()
可以正常工作。
我不知道OP实际遇到了哪些问题。
我不确定OP的公开代码是否准确地复制/粘贴并且缺少的细节是否是OP问题的真正根源。
[当我试图使其运行时,我仔细考虑了第一次尝试中的追溯,并逐步解决了这些错误,直到获得上述结果。