简体   繁体   中英

PyQt5 QMainWindow not displaying central widget

I want to have a central Widget with a grid layout containing multiple other widgets.

the problem is that the central widget is not showing on QMainWindow even after using setCentralWidget function.

here is the code that is not working, i can't find the error (edit: there was no exceptions raised, just the fact i couldn't see the widgets)

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_())

edit: thanks to scheff answer i think i found where i went wrong. to visualize the widgets i changed their backgrounds using setStyleSheet function, on Qt Documentation:

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:

as for the test label i used it for further testing but forgot to add it to the grid layout which added even more confusion.

Unfortunately, the OP claimed that

the problem is that the central widget is not showing on QMainWindow even after using setCentralWidget function.

without elaborating in detail.

I had a rough look onto the source and came to the conclusion that

  • widgets have been added to layout
  • layout is set to widget
  • the widget has been set to QMainWindow .

So far so fine.

Then I copied the complete source of OP to my local box.

To make it running I had to add/modify a variety of things:

  1. All Qt imports were missing. I added

    from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
  2. For sys.argv (in app = QApplication(sys.argv) ), import sys is needed as well.

  3. The widgets Board and Clock were missing.

     #board = Board() #clock = Clock() clock = QLabel('Clock') #board.setStyleSheet('background-color: pink')
  4. The test = QLabel('test') wasn't added to the grid layout.

     grid.addWidget(test, 2, 1, 10, 10)

After having fixed all of this, the (modified) source was this:

#!/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_())

Note:

I added the "hut" in the first line

#!/usr/bin/python3

for my own convenience.

Then I ran it in cygwin64 (because I only had Windows 10 with cygwin at hand):

$ chmod a+x testQMainWindowCentralWidget.py

$ ./testQMainWindowCentralWidget.py 

and got:

./testQMainWindowCentralWidget.py 的快照

Now, the QMainWindow.setCentralWidget() works as expected.

I don't know which issues the OP actually ran in.

I'm not sure whether the exposed code of OP was the exact copy/paste and the missing details were the actual source of OP's problems.

When I tried to make it running I carefully considered the trace-backs I got in the first attempts and fixed the bugs step-by-step respectively until I got the above result.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM