簡體   English   中英

PyQt5 QMainWindow 不顯示中央小部件

[英]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 的完整源代碼復制到我的本地盒子中。

為了讓它運行,我必須添加/修改各種東西:

  1. 缺少所有 Qt 導入。 我添加了

    from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
  2. 對於sys.argv (在app = QApplication(sys.argv)中),也需要import sys

  3. 小部件BoardClock丟失了。

     #board = Board() #clock = Clock() clock = QLabel('Clock') #board.setStyleSheet('background-color: pink')
  4. 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 

並得到:

./testQMainWindowCentralWidget.py 的快照

現在, QMainWindow.setCentralWidget()按預期工作。

我不知道 OP 實際遇到了哪些問題。

我不確定 OP 的公開代碼是否是確切的復制/粘貼,而丟失的細節是否是 OP 問題的實際來源。

當我試圖讓它運行時,我仔細考慮了我在第一次嘗試中得到的回溯,並分別逐步修復了錯誤,直到得到上述結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM