[英]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 的完整源代碼復制到我的本地盒子中。
為了讓它運行,我必須添加/修改各種東西:
缺少所有 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_())
筆記:
我在第一行添加了“小屋”
#!/usr/bin/python3
為了我自己的方便。
然后我在cygwin64中運行它(因為我手頭只有 Windows 10 和 cygwin):
$ chmod a+x testQMainWindowCentralWidget.py
$ ./testQMainWindowCentralWidget.py
並得到:
現在, QMainWindow.setCentralWidget()
按預期工作。
我不知道 OP 實際遇到了哪些問題。
我不確定 OP 的公開代碼是否是確切的復制/粘貼,而丟失的細節是否是 OP 問題的實際來源。
當我試圖讓它運行時,我仔細考慮了我在第一次嘗試中得到的回溯,並分別逐步修復了錯誤,直到得到上述結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.