Показать виджеты в QMainWindow PyQt5

Я пытаюсь сделать графический интерфейс с помощью PyQt5. У меня проблема с отображением виджетов в моем окне.

Мой класс главного окна наследует функции от базового класса QMainWindow.

    class App(QtWidgets.QMainWindow): # This class inherits functions from QMainWindow base class

        def __init__(self):
            super().__init__()
    
            self.initUI() # Call initUI function that initilize app window
    
            
        def initUI(self):
    
            # Set window geometry and title
            self.title = 'This is a title'
            self.left = 0
            self.top = 50
            self.width = 1024
            self.height = 800
    
            self.setGeometry(self.left, self.top, self.width, self.height)
            self.setWindowTitle(self.title)
    
            # Add icon to Window
            self.setWindowIcon(QtGui.QIcon('icon.bmp'))
    
            self.CreateMenu()
    
            self.mywidgets=self.CreateLayout() 
            self.setCentralWidget(self.mywidgets)

            self.show()

Я определяю панель меню и панель инструментов внутри класса главного окна как:

    def CreateMenu(self):
   #%% ***************CREATE MENU************************************************************
   
            mainMenu = self.menuBar()
            self.fileMenu = mainMenu.addMenu('File')
            self.editMenu = mainMenu.addMenu('Edit')
            self.viewMenu = mainMenu.addMenu('View')
            self.toolsMenu = mainMenu.addMenu('Tools')
            self.helpMenu = mainMenu.addMenu('Help')
    
            self.newAction = QAction(QIcon("New.png"), 'New file', self)
            self.newAction.setShortcut("Ctrl+N")
            self.fileMenu.addAction(self.newAction)
    
            self.openAction = QAction(QIcon("Open.png"), 'Open', self)
            self.openAction.setShortcut("Ctrl+O")
            self.fileMenu.addAction(self.openAction)
    
            self.saveAction = QAction(QIcon("Save.png"), 'Save', self)
            self.saveAction.setShortcut("Ctrl+S")
            self.fileMenu.addAction(self.saveAction)

    
            self.helpAction = QAction(QIcon("Help.png"), 'Help', self)
            self.helpAction.setShortcut("Ctrl+H")
            self.helpMenu.addAction(self.helpAction)
    
            self.exitAction = QAction(QIcon("exit.png"), 'Exit', self)
            self.exitAction.setShortcut("Ctrl+E")
            self.fileMenu.addAction(self.exitAction)       
    
    
            # Create toolbar and add buttons to it
            self.toolbar = self.addToolBar('Toolbar')
            self.toolbar.addAction(self.newAction)
            self.toolbar.addAction(self.openAction)
            self.toolbar.addAction(self.saveAction)
            self.toolbar.addAction(self.exitAction)
            self.toolbar.addAction(self.helpAction)

            # Maximize window on startup    
            self.showMaximized()

Я также определяю свой макет и виджеты внутри класса главного окна как:

    def CreateLayout(self):

            # Create main vertical box layout and set it
            self.layout = QtWidgets.QVBoxLayout(self)       
            self.setLayout(self.layout)
            
            # Initialize tab screen
            self.tabs = QtWidgets.QTabWidget()
            self.tab1 = QtWidgets.QWidget() # Raw data plotting tab
            self.tab2 = QtWidgets.QWidget() # Data analysis tab


           #%% **************CREATE TABS*************************************************************
            # Initialize tab screen
            self.tabs = QtWidgets.QTabWidget()
            self.tab1 = QtWidgets.QWidget()    # Tab for plotting raw data
            self.tab2 = QtWidgets.QWidget()    # Data analysis tab


            # Add tabs
            self.tabs.addTab(self.tab1,"Tab1")
            self.tabs.addTab(self.tab2,"Tab2")

            #===========Create first tab==============================================
            self.tab1.layout = QGridLayout(self)
    #------------------------------------------------------------------------------------------------
            # Create frame for sensors
            self.SensorGroupBox = QGroupBox("Sensors")
            self.SensorGroupBox.setFont(QtGui.QFont("Sanserif", 15))
            self.tab1.layout.addWidget(self.SensorGroupBox,0,0,2,2) # add frame to main layout and define span

            # Create frame for options
            self.PlotGroupBox = QGroupBox("Plot options")
            self.PlotGroupBox.setFont(QtGui.QFont("Sanserif", 15))
            self.tab1.layout.addWidget(self.PlotGroupBox,2,0,2,2) # add frame to main layout and define span
    
    #------------------------------------------------------------------------------------------------
            self.vbox = QVBoxLayout() # Create vertical layout to place items inside the Sensor frame
    
            # Define tree widget for all sensors     
            tree    = QtWidgets.QTreeWidget()
            tree.setHeaderLabels(['Sensor','Time'])
            self.vbox.addWidget(tree,0)
            tree.header().setStretchLastSection(True);
    
            for i in range(3):
                parent = QtWidgets.QTreeWidgetItem(tree)
                parent.setText(0, "Parent {}".format(i))
                parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
                for x in range(5):
                    child = QtWidgets.QTreeWidgetItem(parent)
                    child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
                    child.setText(0, "Child {}".format(x))
                    child.setCheckState(0, Qt.Unchecked)
             tree.show() 
    
            self.SensorGroupBox.setLayout(self.vbox) # Set vertical layout to the frame
    #------------------------------------------------------------------------------------------------
            # Graph Widget
            self.graphWidget = pg.PlotWidget()
            self.graphWidget.setFrameShape(QtWidgets.QFrame.Box)
            self.graphWidget.getPlotItem().showGrid(x=True,y=True,alpha=0.9)
            self.graphWidget.setBackground('k')
            x=[]
            y=[]
            self.plot = self.graphWidget.plot(x, y, pen=pg.mkPen('r', alpha=0.85))
            self.tab1.layout.addWidget(self.graphWidget,0,2,4,1)

            # Set tab1 layout
            self.tab1.setLayout(self.tab1.layout)

            # Add tabs to widget
            self.layout.addWidget(self.tabs)
            self.setLayout(self.layout)

Когда я запускаю код, моя панель меню и панель инструментов отображаются и работают правильно, однако ни один из моих виджетов не отображается. Я думаю, что проблема может заключаться в том, где я установил свой центральный виджет. Я не уверен, что это правильно:

    self.mywidgets=self.CreateLayout() 
    self.setCentralWidget(self.mywidgets)

Может кто-нибудь сказать мне, что я делаю неправильно здесь?

Примечание. Я знаю, что могу определить отдельный класс для своих виджетов:

    class MyWidget(QtWidgets.QWidget): # This class inherits functions from QWidget base class
    
        def __init__(self, parent):
            super(QtWidgets.QWidget, self).__init__(parent)

        .
        .
        .

А затем создайте экземпляр в моем основном классе и установите его в качестве центрального виджета, например:

    # Run MyWidget class
    self.my_widgets = MyWidget(self)
    self.setCentralWidget(self.my_widgets)

Это работает, но я хочу иметь один класс (QmainWindow) и определять там все.


person qepasol    schedule 18.09.2020    source источник
comment
QMainWindow — это особый вид подкласса QWidget, который имеет собственный макет (который нельзя заменить). Вы должны создать QWidget, который действует как контейнер, и использовать setLayout() и self.setCentralWidget() с этим виджетом. Также обратите внимание, что ваша функция CreateLayout ничего не возвращает, поэтому self.setCentralWidget(self.mywidgets) не будет работать, поскольку self.mywidgets равно None. См. Главное окно PyQt не отображает виджеты   -  person musicamante    schedule 18.09.2020