我想要一个中央小部件,其网格布局包含多个其他小部件。
问题在于,即使使用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的回答,我认为我发现了我出了错。 可视化我在Qt文档上使用setStyleSheet函数更改背景的小部件:
注意:如果您从QWidget继承了自定义小部件,则为了使用StyleSheets,您需要向自定义小部件提供paintEvent:
对于测试标签,我将其用于进一步的测试,但是忘记将其添加到网格布局中,这更加增加了混乱。
答案 0 :(得分:0)
不幸的是,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问题的真正根源。
当我试图使其运行时,我仔细考虑了第一次尝试中得到的追溯,并逐步解决了这些错误,直到获得上述结果为止。