Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. PySide2 force killing qapplication
Qt 6.11 is out! See what's new in the release blog

PySide2 force killing qapplication

Scheduled Pinned Locked Moved Unsolved General and Desktop
pyside2
15 Posts 3 Posters 2.5k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #2

    Hi,

    Not a direct answer but do you really need to restart the application ? Can't you just show the widget again ?

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

    D 1 Reply Last reply
    0
    • SGaistS SGaist

      Hi,

      Not a direct answer but do you really need to restart the application ? Can't you just show the widget again ?

      D Offline
      D Offline
      Dariusz
      wrote on last edited by
      #3

      @SGaist If user closes widget then that would finish the qapplication and aventaully delete it ?
      I was thinking of overriding closeEvent to hide() instead but not sure if that will kick...

      Or maybe I'm wrong ?

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

        It depends on what you want your application to do.

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

        D 1 Reply Last reply
        0
        • SGaistS SGaist

          It depends on what you want your application to do.

          D Offline
          D Offline
          Dariusz
          wrote on last edited by
          #5

          @SGaist Well the issue starts that when user click second time on widget, it should reload it / show it again... I kinda got it to work with

              try:
                  qApp = QApplication(sys.argv)
                  widget = mw()
                  MainWindow = mainWindow()
                  widget.setCentralWidget(MainWindow)
                  widget.show()
                  print("Starting app")
                  qApp.exec_()
              except RuntimeError:
                  widget.hide()
                  widget.show()
          

          But that won't allow for script to reload so kinda... meh, but kinda works :- )

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

            What exact error do you get ?

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

            D 1 Reply Last reply
            0
            • SGaistS SGaist

              What exact error do you get ?

              D Offline
              D Offline
              Dariusz
              wrote on last edited by
              #7

              @SGaist RuntimeError: Please destroy the QApplication singleton before creating a new QApplication instance.

              JonBJ 1 Reply Last reply
              0
              • D Dariusz

                @SGaist RuntimeError: Please destroy the QApplication singleton before creating a new QApplication instance.

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

                @Dariusz
                Try

                app = QApplication.instance()
                if app is None: 
                    app = QApplication(sys.argv)
                

                Separately, not sure what your try: ... except ...: is trying to achieve, do you need it, I would remove it as it looks to me like it will just mask errors.

                D 1 Reply Last reply
                0
                • JonBJ JonB

                  @Dariusz
                  Try

                  app = QApplication.instance()
                  if app is None: 
                      app = QApplication(sys.argv)
                  

                  Separately, not sure what your try: ... except ...: is trying to achieve, do you need it, I would remove it as it looks to me like it will just mask errors.

                  D Offline
                  D Offline
                  Dariusz
                  wrote on last edited by
                  #9

                  @JonB I had that option, but it somehow was erororing. Its as if the thread was not shutting down properly due to Qt keeping it alive. And then when secondary thread kick off try to run the app it was crashing.

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

                    Can you provide a minimal example that shows how you are trying to implement that ?

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

                    D 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      Can you provide a minimal example that shows how you are trying to implement that ?

                      D Offline
                      D Offline
                      Dariusz
                      wrote on last edited by Dariusz
                      #11

                      @SGaist Hey

                      Sure it runs as follows >

                      global blndCtx
                      global thread
                      global qApp
                      global widget
                      
                      #blender operator
                      class CustomWindowOperator(Operator):
                          bl_idname = 'screen.custom_window'
                          bl_label = 'Render Manager'
                          mainContextManager = None
                      
                          #def __init__(self):
                          #    super().__init__(mainWrapper)
                      
                          def execute(self, context):
                              print("IM INVOKING pyside2widget!")
                              Invoke(context)
                              return {'FINISHED'}
                      
                      def Invoke(context):
                          global blndCtx
                          global thread
                          global qApp
                          blndCtx = context
                          thread = threading.Thread(target=LoadWindow, name='Daemon')
                          thread.daemon = True
                          thread.start()
                      
                      
                      def LoadWindow():
                          global blndCtx
                          global thread
                          global qApp
                          global widget
                          try:
                              qApp = QApplication(sys.argv)
                              widget = mw()
                              MainWindow = mainWindow()
                              MainWindow.init(blndCtx, widget)
                              widget.setCentralWidget(MainWindow)
                              widget.show()
                              print("Starting app")
                              qApp.exec_()
                          except RuntimeError:
                              widget.hide()
                              widget.show()
                          '''
                          qApp = QApplication(sys.argv)
                          widget = mw()
                          MainWindow = mainWindow()
                          MainWindow.init(blndCtx, widget)
                          widget.setCentralWidget(MainWindow)
                          widget.show()
                          print("Starting app")
                          qApp.exec_()
                          qApp.exit()
                          qApp.deleteLater()
                          del qApp
                          '''
                      
                      

                      I used to have what @JonB had suggested but that caused issues. This one "somewhat works". It does not restart the app however like I hoped to, but just shows/hide.

                      The globals here are remnent of early tries, where I wanted to test if it exist/force delete etc it. But sadly that did not work.

                      TIA

                      JonBJ 1 Reply Last reply
                      0
                      • D Dariusz

                        @SGaist Hey

                        Sure it runs as follows >

                        global blndCtx
                        global thread
                        global qApp
                        global widget
                        
                        #blender operator
                        class CustomWindowOperator(Operator):
                            bl_idname = 'screen.custom_window'
                            bl_label = 'Render Manager'
                            mainContextManager = None
                        
                            #def __init__(self):
                            #    super().__init__(mainWrapper)
                        
                            def execute(self, context):
                                print("IM INVOKING pyside2widget!")
                                Invoke(context)
                                return {'FINISHED'}
                        
                        def Invoke(context):
                            global blndCtx
                            global thread
                            global qApp
                            blndCtx = context
                            thread = threading.Thread(target=LoadWindow, name='Daemon')
                            thread.daemon = True
                            thread.start()
                        
                        
                        def LoadWindow():
                            global blndCtx
                            global thread
                            global qApp
                            global widget
                            try:
                                qApp = QApplication(sys.argv)
                                widget = mw()
                                MainWindow = mainWindow()
                                MainWindow.init(blndCtx, widget)
                                widget.setCentralWidget(MainWindow)
                                widget.show()
                                print("Starting app")
                                qApp.exec_()
                            except RuntimeError:
                                widget.hide()
                                widget.show()
                            '''
                            qApp = QApplication(sys.argv)
                            widget = mw()
                            MainWindow = mainWindow()
                            MainWindow.init(blndCtx, widget)
                            widget.setCentralWidget(MainWindow)
                            widget.show()
                            print("Starting app")
                            qApp.exec_()
                            qApp.exit()
                            qApp.deleteLater()
                            del qApp
                            '''
                        
                        

                        I used to have what @JonB had suggested but that caused issues. This one "somewhat works". It does not restart the app however like I hoped to, but just shows/hide.

                        The globals here are remnent of early tries, where I wanted to test if it exist/force delete etc it. But sadly that did not work.

                        TIA

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

                        @Dariusz
                        I'm just going to throw this out there: I do not know whether it might be the cause of problems. ( @SGaist might know whether this relevant?)

                        You are keeping global references around, to things like qApp & widget. That is going to stop Python from releasing these objects. Meanwhile, you are seem to be trying to create new QApplication. And you're getting RuntimeError: Please destroy the QApplication singleton before creating a new QApplication instance. I wonder whether the retained references are contributing to/clouding the issue.

                        Can you get rid of these globals to start with a cleaner architecture, in case they are getting in the way of proper behaviour?

                        1 Reply Last reply
                        2
                        • D Offline
                          D Offline
                          Dariusz
                          wrote on last edited by
                          #13

                          Hey

                          I tried getting rid of Globals, sadly did not help.

                          Another issue I found is that if I start app again, Ie Try/Else from above and else happens, the app "runs" but I can't make new widgets as I get> QWidget: Cannot create a QWidget without QApplication I wonder how could I re-configure app to have valid qapp application hmhmmm

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

                            Would it be possible to have a complete minimal script to test ?

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

                            D 1 Reply Last reply
                            0
                            • SGaistS SGaist

                              Would it be possible to have a complete minimal script to test ?

                              D Offline
                              D Offline
                              Dariusz
                              wrote on last edited by
                              #15

                              @SGaist I'll pull something together. You will need blender 2.83+ however to test it.

                              1 Reply Last reply
                              0

                              • Login

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