Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. Qt Creator and Pyside2 - Blank Window
Forum Updated to NodeBB v4.3 + New Features

Qt Creator and Pyside2 - Blank Window

Scheduled Pinned Locked Moved Solved Qt for Python
16 Posts 5 Posters 5.2k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Marcus Adamski
    wrote on last edited by
    #1

    Hello there,

    Just started experimenting with Pyside2 for use with a new Python project. Initially I was looking at using Qt Creator and loading the ".ui" file (no conversion) - but I simply cannot get the resulting window to display any widgets?

    Using the Qt Creator I created a project, which automatically added a QDialogue ui file and included the code to load and run the window. I simply added a PushButton - then run the project. Just see a blank window.

    I can successfully create gui's "manually" using Pyside2, so I know the framework is working. I just cannot load a UI file and show it? Tried multiple different projects.

    For completeness, I've added the code loading the UI file - I guess this is a common issue, can you please let me know what I'm doing wrong:

    # This Python file uses the following encoding: utf-8
    import sys
    import os
    
    from PySide2 import QtWidgets
    from PySide2.QtCore import QFile
    from PySide2.QtUiTools import QUiLoader
    
    
    class main(QtWidgets.QDialog):
        def __init__(self):
            super(main, 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 = QtWidgets.QApplication([])
        widget = main()
        widget.show()
        sys.exit(app.exec_())
    

    Thanks for your help.

    JonBJ 1 Reply Last reply
    0
    • M Marcus Adamski

      Sure, the following is the UI for QWidget.

      <?xml version="1.0" encoding="UTF-8"?>
      <ui version="4.0">
       <class>main_window</class>
       <widget class="QWidget" name="main_window">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>0</y>
          <width>800</width>
          <height>600</height>
         </rect>
        </property>
        <property name="windowTitle">
         <string>main_window</string>
        </property>
        <widget class="QPushButton" name="pushButton">
         <property name="geometry">
          <rect>
           <x>40</x>
           <y>40</y>
           <width>75</width>
           <height>23</height>
          </rect>
         </property>
         <property name="text">
          <string>PushButton</string>
         </property>
        </widget>
       </widget>
       <resources/>
       <connections/>
      </ui>
      

      ... and for the QMainApplication:

      <?xml version="1.0" encoding="UTF-8"?>
      <ui version="4.0">
       <class>main_window</class>
       <widget class="QMainWindow" name="main_window">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>0</y>
          <width>800</width>
          <height>600</height>
         </rect>
        </property>
        <property name="windowTitle">
         <string>main_window</string>
        </property>
        <widget class="QWidget" name="centralwidget">
         <widget class="QPushButton" name="pushButton">
          <property name="geometry">
           <rect>
            <x>70</x>
            <y>80</y>
            <width>75</width>
            <height>23</height>
           </rect>
          </property>
          <property name="text">
           <string>PushButton</string>
          </property>
         </widget>
        </widget>
        <widget class="QMenuBar" name="menubar">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>0</y>
           <width>800</width>
           <height>21</height>
          </rect>
         </property>
        </widget>
        <widget class="QStatusBar" name="statusbar"/>
       </widget>
       <resources/>
       <connections/>
      </ui>
      

      On both projects, in the above UIs the only change is the addition of a single pushbutton to identify the window

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #12

      @Marcus-Adamski
      Now going all the way back to your original Designer UI files, and why your code works with a QWidget but not with a QMainWindow.

      In your QMainWindow .ui file you have:

        <widget class="QWidget" name="centralwidget">
         <widget class="QPushButton" name="pushButton">
      

      This is not right, and Designer will be showing you a warning "no-entry" marker on centralwidget in the pane where it shows your widget hierarchy. You ignore this at your peril! Layout will "go wrong" if you make a QWidget a direct child on another (non-container) QWidget such as QMainWindow.centralWidget without you putting in a layout. The same would happen if you did this in your own code, though you wouldn't get any warning.

      Go back into Designer and give your central widget a layout: in the widget hierarchy pane, right-click on main_window, pick Lay out, pick Lay Out Horizontally.

      Now, to make it work in the QMainWindow case: I originally told you:

      @Marcus-Adamski
      PySide 2 QUiLoader().load() returns a widget you need to show().
      https://stackoverflow.com/questions/50128293/pyside2-quiloader-returns-an-empty-window

      but you did not act on this. You need to change two lines:

      loader.load(ui_file, self).show()
      # widget.show()
      

      So, I have made the return result from loader.load(ui_file, self) be the widget to call show() on, and got rid of your show() on the object constructed via main_window(). Once you see that works you can tidy the code to do this in a better way.

      You should get the push button visible as you do in the plain QWidget-non-QMainWindow case. You can then continue to use the Designer for your application if you wish to, as many do.

      1 Reply Last reply
      0
      • M Marcus Adamski

        Hello there,

        Just started experimenting with Pyside2 for use with a new Python project. Initially I was looking at using Qt Creator and loading the ".ui" file (no conversion) - but I simply cannot get the resulting window to display any widgets?

        Using the Qt Creator I created a project, which automatically added a QDialogue ui file and included the code to load and run the window. I simply added a PushButton - then run the project. Just see a blank window.

        I can successfully create gui's "manually" using Pyside2, so I know the framework is working. I just cannot load a UI file and show it? Tried multiple different projects.

        For completeness, I've added the code loading the UI file - I guess this is a common issue, can you please let me know what I'm doing wrong:

        # This Python file uses the following encoding: utf-8
        import sys
        import os
        
        from PySide2 import QtWidgets
        from PySide2.QtCore import QFile
        from PySide2.QtUiTools import QUiLoader
        
        
        class main(QtWidgets.QDialog):
            def __init__(self):
                super(main, 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 = QtWidgets.QApplication([])
            widget = main()
            widget.show()
            sys.exit(app.exec_())
        

        Thanks for your help.

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #2

        @Marcus-Adamski
        PySide 2 QUiLoader().load() returns a widget you need to show().
        https://stackoverflow.com/questions/50128293/pyside2-quiloader-returns-an-empty-window

        1 Reply Last reply
        1
        • M Offline
          M Offline
          Marcus Adamski
          wrote on last edited by
          #3

          Thanks very much - I'll try tomorrow morning. The code I supplied was directly generated by Qt Creator ... strange it doesn't work?

          I'll reply back once I've tested your suggestion.

          JonBJ 1 Reply Last reply
          0
          • M Marcus Adamski

            Thanks very much - I'll try tomorrow morning. The code I supplied was directly generated by Qt Creator ... strange it doesn't work?

            I'll reply back once I've tested your suggestion.

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by JonB
            #4

            @Marcus-Adamski
            It's only a suggestion :) If it was generated by Creator I agree it would be odd. Compare your generated code to what they are saying in that post. Now that I look at it, maybe you/it are doing the show(), have a play with your loader.load(ui_file, self) line.

            1 Reply Last reply
            0
            • M Offline
              M Offline
              Marcus Adamski
              wrote on last edited by
              #5

              OK - this is the currently situation. Using the latest QT Creator and just PySide2 installed,

              1. when creating a new project, and selecting "Qt for Python - Window (UI) file and "QMainWindow" as the base class, the following code is autogenerated (I've not modified it):
              # 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 main_window(QMainWindow):
                  def __init__(self):
                      super(main_window, 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 = main_window()
                  widget.show()
                  sys.exit(app.exec_())
              

              When run, I only get a blank window. To me, it appears the UI file is not being loaded and associated to QMainWindow. Experimenting, in the designer, I've changed the window title and added one button, but when run, neither change is shown on the resulting blank window.

              1. However, instead, if I select "QWidget" as my base class, apart from the imports, the same code is geneated, but this works. (Again this code has not be altered):
              # This Python file uses the following encoding: utf-8
              import sys
              import os
              
              
              from PySide2.QtWidgets import QApplication, QWidget
              from PySide2.QtCore import QFile
              from PySide2.QtUiTools import QUiLoader
              
              
              class main_window(QWidget):
                  def __init__(self):
                      super(main_window, 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 = main_window()
                  widget.show()
                  sys.exit(app.exec_())
              
              

              Could someone please explain why the QMainWindow based autogenerated code doesn't work, but the QWidget code does?

              Many thanks

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #6

                Hi,

                Can you share the UI code as well ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Marcus Adamski
                  wrote on last edited by
                  #7

                  Sure, the following is the UI for QWidget.

                  <?xml version="1.0" encoding="UTF-8"?>
                  <ui version="4.0">
                   <class>main_window</class>
                   <widget class="QWidget" name="main_window">
                    <property name="geometry">
                     <rect>
                      <x>0</x>
                      <y>0</y>
                      <width>800</width>
                      <height>600</height>
                     </rect>
                    </property>
                    <property name="windowTitle">
                     <string>main_window</string>
                    </property>
                    <widget class="QPushButton" name="pushButton">
                     <property name="geometry">
                      <rect>
                       <x>40</x>
                       <y>40</y>
                       <width>75</width>
                       <height>23</height>
                      </rect>
                     </property>
                     <property name="text">
                      <string>PushButton</string>
                     </property>
                    </widget>
                   </widget>
                   <resources/>
                   <connections/>
                  </ui>
                  

                  ... and for the QMainApplication:

                  <?xml version="1.0" encoding="UTF-8"?>
                  <ui version="4.0">
                   <class>main_window</class>
                   <widget class="QMainWindow" name="main_window">
                    <property name="geometry">
                     <rect>
                      <x>0</x>
                      <y>0</y>
                      <width>800</width>
                      <height>600</height>
                     </rect>
                    </property>
                    <property name="windowTitle">
                     <string>main_window</string>
                    </property>
                    <widget class="QWidget" name="centralwidget">
                     <widget class="QPushButton" name="pushButton">
                      <property name="geometry">
                       <rect>
                        <x>70</x>
                        <y>80</y>
                        <width>75</width>
                        <height>23</height>
                       </rect>
                      </property>
                      <property name="text">
                       <string>PushButton</string>
                      </property>
                     </widget>
                    </widget>
                    <widget class="QMenuBar" name="menubar">
                     <property name="geometry">
                      <rect>
                       <x>0</x>
                       <y>0</y>
                       <width>800</width>
                       <height>21</height>
                      </rect>
                     </property>
                    </widget>
                    <widget class="QStatusBar" name="statusbar"/>
                   </widget>
                   <resources/>
                   <connections/>
                  </ui>
                  

                  On both projects, in the above UIs the only change is the addition of a single pushbutton to identify the window

                  JonBJ 1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    Marcus Adamski
                    wrote on last edited by Marcus Adamski
                    #8

                    Actually, for QMainWindow, I don't think PySide2 allows the UI file to be loaded from within the constructor.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Marcus Adamski
                      wrote on last edited by
                      #9

                      Thanks @Denni-0 for the valuable input. It's really helpful to have a solid template from which to explore the rest of Qt. I planned to use Qt Designer to get the feel of how the Qt framework behaves, then start coding the UI by hand. Right - next step, become more familiar with the Qt layouts

                      Thanks again

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        Marcus Adamski
                        wrote on last edited by
                        #10

                        Just ran your code - initially got the error "'MainWindow' object has no attribute 'SetStatusBar'".
                        However, after commenting out the following lines:

                             #self.StatBar = self.statusBar()
                             #self.SetStatusBar('Ready')
                        

                        and running the code, unfortunately a single window is displayed with the title "Da Pusher" .... but there's no button, just a blank window.

                        window.jpg

                        Have to pop out now - will take another look at the code this evening.

                        Just out of interested, why does QWidget check:

                        if self.Parent == None:
                        

                        is this so the QWidget can also run as an individual window if needed?

                        Thanks

                        JonBJ 1 Reply Last reply
                        0
                        • M Marcus Adamski

                          Just ran your code - initially got the error "'MainWindow' object has no attribute 'SetStatusBar'".
                          However, after commenting out the following lines:

                               #self.StatBar = self.statusBar()
                               #self.SetStatusBar('Ready')
                          

                          and running the code, unfortunately a single window is displayed with the title "Da Pusher" .... but there's no button, just a blank window.

                          window.jpg

                          Have to pop out now - will take another look at the code this evening.

                          Just out of interested, why does QWidget check:

                          if self.Parent == None:
                          

                          is this so the QWidget can also run as an individual window if needed?

                          Thanks

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by JonB
                          #11

                          @Marcus-Adamski
                          In the code you have been given there are a couple of mistakes.

                          Apart from the self.SetStatusBar you noted, the problem you see stems from:

                                  VBox = QVBoxLayout()
                                  HBox.addStretch(1)
                                  HBox.addLayout(HBox)
                                  HBox.addStretch(1)
                          

                          This gives a warning "QLayout: Cannot add layout QHBoxLayout/ to itself", and under Linux dumps core on exit from the app.

                          If you correct this to:

                                  VBox = QVBoxLayout()
                                  VBox.addStretch(1)
                                  VBox.addLayout(HBox)
                                  VBox.addStretch(1)
                          

                          the problems go away, and you will see the push button.

                          1 Reply Last reply
                          1
                          • M Marcus Adamski

                            Sure, the following is the UI for QWidget.

                            <?xml version="1.0" encoding="UTF-8"?>
                            <ui version="4.0">
                             <class>main_window</class>
                             <widget class="QWidget" name="main_window">
                              <property name="geometry">
                               <rect>
                                <x>0</x>
                                <y>0</y>
                                <width>800</width>
                                <height>600</height>
                               </rect>
                              </property>
                              <property name="windowTitle">
                               <string>main_window</string>
                              </property>
                              <widget class="QPushButton" name="pushButton">
                               <property name="geometry">
                                <rect>
                                 <x>40</x>
                                 <y>40</y>
                                 <width>75</width>
                                 <height>23</height>
                                </rect>
                               </property>
                               <property name="text">
                                <string>PushButton</string>
                               </property>
                              </widget>
                             </widget>
                             <resources/>
                             <connections/>
                            </ui>
                            

                            ... and for the QMainApplication:

                            <?xml version="1.0" encoding="UTF-8"?>
                            <ui version="4.0">
                             <class>main_window</class>
                             <widget class="QMainWindow" name="main_window">
                              <property name="geometry">
                               <rect>
                                <x>0</x>
                                <y>0</y>
                                <width>800</width>
                                <height>600</height>
                               </rect>
                              </property>
                              <property name="windowTitle">
                               <string>main_window</string>
                              </property>
                              <widget class="QWidget" name="centralwidget">
                               <widget class="QPushButton" name="pushButton">
                                <property name="geometry">
                                 <rect>
                                  <x>70</x>
                                  <y>80</y>
                                  <width>75</width>
                                  <height>23</height>
                                 </rect>
                                </property>
                                <property name="text">
                                 <string>PushButton</string>
                                </property>
                               </widget>
                              </widget>
                              <widget class="QMenuBar" name="menubar">
                               <property name="geometry">
                                <rect>
                                 <x>0</x>
                                 <y>0</y>
                                 <width>800</width>
                                 <height>21</height>
                                </rect>
                               </property>
                              </widget>
                              <widget class="QStatusBar" name="statusbar"/>
                             </widget>
                             <resources/>
                             <connections/>
                            </ui>
                            

                            On both projects, in the above UIs the only change is the addition of a single pushbutton to identify the window

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #12

                            @Marcus-Adamski
                            Now going all the way back to your original Designer UI files, and why your code works with a QWidget but not with a QMainWindow.

                            In your QMainWindow .ui file you have:

                              <widget class="QWidget" name="centralwidget">
                               <widget class="QPushButton" name="pushButton">
                            

                            This is not right, and Designer will be showing you a warning "no-entry" marker on centralwidget in the pane where it shows your widget hierarchy. You ignore this at your peril! Layout will "go wrong" if you make a QWidget a direct child on another (non-container) QWidget such as QMainWindow.centralWidget without you putting in a layout. The same would happen if you did this in your own code, though you wouldn't get any warning.

                            Go back into Designer and give your central widget a layout: in the widget hierarchy pane, right-click on main_window, pick Lay out, pick Lay Out Horizontally.

                            Now, to make it work in the QMainWindow case: I originally told you:

                            @Marcus-Adamski
                            PySide 2 QUiLoader().load() returns a widget you need to show().
                            https://stackoverflow.com/questions/50128293/pyside2-quiloader-returns-an-empty-window

                            but you did not act on this. You need to change two lines:

                            loader.load(ui_file, self).show()
                            # widget.show()
                            

                            So, I have made the return result from loader.load(ui_file, self) be the widget to call show() on, and got rid of your show() on the object constructed via main_window(). Once you see that works you can tidy the code to do this in a better way.

                            You should get the push button visible as you do in the plain QWidget-non-QMainWindow case. You can then continue to use the Designer for your application if you wish to, as many do.

                            1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              Marcus Adamski
                              wrote on last edited by
                              #13

                              Thanks to both @JonB and @Denni-0 , I now have a solid template (and better understanding) to explore QT further. Much appreciated.

                              1 Reply Last reply
                              0
                              • ErriezE Offline
                                ErriezE Offline
                                Erriez
                                wrote on last edited by Erriez
                                #14

                                I had the same problem with PySide6 on Ubuntu 22.04 and Windows 10: Creating a new project with QMainWindow does not work. See my question on StackOverflow.

                                Complete fixed example:

                                # This Python file uses the following encoding: utf-8
                                import os
                                from pathlib import Path
                                import sys
                                
                                from PySide6.QtWidgets import QApplication, QMainWindow
                                from PySide6.QtCore import QFile
                                from PySide6.QtUiTools import QUiLoader
                                
                                
                                class MainWindow(QMainWindow):
                                    def __init__(self, parent=None):
                                        super().__init__(parent)
                                        self.load_ui()
                                
                                    def load_ui(self):
                                        loader = QUiLoader()
                                        path = Path(__file__).resolve().parent / "form.ui"
                                        ui_file = QFile(path)
                                        ui_file.open(QFile.ReadOnly)
                                
                                -        loader.load(ui_file, self)
                                +        widget = loader.load(ui_file, self)
                                
                                        ui_file.close()
                                
                                +        widget.show()
                                
                                
                                if __name__ == "__main__":
                                    app = QApplication(sys.argv)
                                    widget = MainWindow()
                                -    # widget.show()
                                    sys.exit(app.exec())
                                

                                As beginner I spent a lot of time to figure out why. Can someone please make the generated code functional in Qt Creator when creating a new project?

                                JonBJ 1 Reply Last reply
                                0
                                • ErriezE Erriez

                                  I had the same problem with PySide6 on Ubuntu 22.04 and Windows 10: Creating a new project with QMainWindow does not work. See my question on StackOverflow.

                                  Complete fixed example:

                                  # This Python file uses the following encoding: utf-8
                                  import os
                                  from pathlib import Path
                                  import sys
                                  
                                  from PySide6.QtWidgets import QApplication, QMainWindow
                                  from PySide6.QtCore import QFile
                                  from PySide6.QtUiTools import QUiLoader
                                  
                                  
                                  class MainWindow(QMainWindow):
                                      def __init__(self, parent=None):
                                          super().__init__(parent)
                                          self.load_ui()
                                  
                                      def load_ui(self):
                                          loader = QUiLoader()
                                          path = Path(__file__).resolve().parent / "form.ui"
                                          ui_file = QFile(path)
                                          ui_file.open(QFile.ReadOnly)
                                  
                                  -        loader.load(ui_file, self)
                                  +        widget = loader.load(ui_file, self)
                                  
                                          ui_file.close()
                                  
                                  +        widget.show()
                                  
                                  
                                  if __name__ == "__main__":
                                      app = QApplication(sys.argv)
                                      widget = MainWindow()
                                  -    # widget.show()
                                      sys.exit(app.exec())
                                  

                                  As beginner I spent a lot of time to figure out why. Can someone please make the generated code functional in Qt Creator when creating a new project?

                                  JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by
                                  #15

                                  @Erriez said in Qt Creator and Pyside2 - Blank Window:

                                  Can you please fix this issue when creating a new project?

                                  Hi. What does this mean? If you mean can somebody here fix what Python code Designer generates you would have to report an issue to Qt developers, we are just a forum of users like yourself!

                                  ErriezE 1 Reply Last reply
                                  1
                                  • JonBJ JonB

                                    @Erriez said in Qt Creator and Pyside2 - Blank Window:

                                    Can you please fix this issue when creating a new project?

                                    Hi. What does this mean? If you mean can somebody here fix what Python code Designer generates you would have to report an issue to Qt developers, we are just a forum of users like yourself!

                                    ErriezE Offline
                                    ErriezE Offline
                                    Erriez
                                    wrote on last edited by Erriez
                                    #16

                                    @JonB Yes, my question is for the Qt developers to fix the generated code in Qt Creator. I had a bad start when creating a new project which does not work out of the box.
                                    You're right, https://bugreports.qt.io is used to report bugs and not this forum. I'll follow-up here. Thanks!

                                    1 Reply Last reply
                                    1

                                    • Login

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • Users
                                    • Groups
                                    • Search
                                    • Get Qt Extensions
                                    • Unsolved