widgets are not showing when inheriting the QMainWindow class



  • Hi,
    I created a test project in qt-creator and choosing "qt for python- window (UI) file" as a template and a QMainWindow as a base class, then added a single push button and applied a grid layout to the centralwidget but after clicking Ctrl+r to run the project I only see a blank window with no widgets.

    form.ui (generated by qt creator, not modified):

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>test</class>
     <widget class="QMainWindow" name="test">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>800</width>
        <height>600</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>test</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <layout class="QGridLayout" name="gridLayout">
        <item row="0" column="0">
         <widget class="QPushButton" name="pushButton">
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>800</width>
         <height>34</height>
        </rect>
       </property>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
     </widget>
     <resources/>
     <connections/>
    </ui>
    
    

    main.py (generated by qt creator, not modified):

    # This Python file uses the following encoding: utf-8
    import sys
    import os
    
    
    from PySide2.QtWidgets import QApplication, QMainWindow
    from PySide2.QtCore import QFile
    from PySide2.QtUiTools import QUiLoader
    
    
    class test(QMainWindow):
        def __init__(self):
            super(test, self).__init__()
            self.load_ui()
    
        def load_ui(self):
            loader = QUiLoader()
            path = os.path.join(os.path.dirname(__file__), "form.ui")
            ui_file = QFile(path)
            ui_file.open(QFile.ReadOnly)
            loader.load(ui_file, self)
            ui_file.close()
    
    if __name__ == "__main__":
        app = QApplication([])
        widget = test()
        widget.show()
        sys.exit(app.exec_())
    
    

    note that choosing Qwidget as a base class works fine and I can see the push button without a problem, if I convert the UI file using the pyuic command it works and runs just fine, also if I load the UI file without inheriting a class it works fine as well like so:

    import sys
    
    
    from PySide2.QtWidgets import QApplication
    from PySide2.QtUiTools import QUiLoader
    
    
    if __name__ == "__main__":
        app = QApplication([])
        w = QUiLoader().load("form.ui")
        w.show()
        sys.exit(app.exec_())
    

  • Lifetime Qt Champion

    @rhx9 said in widgets are not showing when inheriting the QMainWindow class:

    loader.load(ui_file, self)

    Use https://doc.qt.io/qt-5/qmainwindow.html#centralWidget as parent:

    loader.load(ui_file, self.centralWidget())
    


  • @jsulm said in widgets are not showing when inheriting the QMainWindow class:

    @rhx9 said in widgets are not showing when inheriting the QMainWindow class:

    loader.load(ui_file, self)

    Use https://doc.qt.io/qt-5/qmainwindow.html#centralWidget as parent:

    loader.load(ui_file, self.centralWidget())
    

    Nope, doesn't work. also printing self.centralWidget() returns None since it is only set after loading a UI if I'm not mistaken



  • This post is deleted!


  • @rhx9 I had the same issue, solution:

    change

    widget.show()

    to

    widget.centralWidget().show()

    Loading the ui file populates the centralWidget property of the QMainWindow object, which is the primary content of the main window.

    There is no show() method of QMainWindow, the parent class of test.

    See https://doc.qt.io/qt-5/qmainwindow.html



  • Aside from the visual issue, the ui file is creating a QMainWindow that is then populated into another QMainWindow.



  • @KNewman said in widgets are not showing when inheriting the QMainWindow class:

    @rhx9 I had the same issue, solution:

    There is no show() method of QMainWindow, the parent class of test.

    QMainWindow derives from QWidget, which provides show().

    See https://doc.qt.io/qt-5/qmainwindow.html

    It's under the "List of all members, including inherited members" link.


Log in to reply