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. Pyside6 how to disconnect connection?
Forum Updated to NodeBB v4.3 + New Features

Pyside6 how to disconnect connection?

Scheduled Pinned Locked Moved Unsolved General and Desktop
qgraphicssceneqgraphicsitemqobjesignal
34 Posts 5 Posters 15.7k Views 3 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.
  • eyllanescE eyllanesc

    @Dariusz Why do you say The problem is that my signal is still "connected" somehow? could you provide a minimal and reproducible example

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

    @eyllanesc said in Pyside6 how to disconnect connection?:

    @Dariusz Why do you say The problem is that my signal is still "connected" somehow? could you provide a minimal and reproducible example

    I wish I could but that is a problem in quite "large" app. I'm trying to clean it up with memory now and object deletion. As far as I could tell removing item from view & deleting it. If I interacted with view he would still call the item function & crash.

    eyllanescE 1 Reply Last reply
    0
    • D Dariusz

      @eyllanesc said in Pyside6 how to disconnect connection?:

      @Dariusz Why do you say The problem is that my signal is still "connected" somehow? could you provide a minimal and reproducible example

      I wish I could but that is a problem in quite "large" app. I'm trying to clean it up with memory now and object deletion. As far as I could tell removing item from view & deleting it. If I interacted with view he would still call the item function & crash.

      eyllanescE Offline
      eyllanescE Offline
      eyllanesc
      wrote on last edited by
      #8

      @Dariusz I think that the problem is another, or your implementation does not generate the behavior you expect, so it is necessary that you provide an MRE in order to analyze the cause or solution of the problem. I have not asked you for the code of your project, if your project is small then it can be an MRE, but I have asked you to create another script focused on the functionality that generates problems.

      If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

      1 Reply Last reply
      0
      • jeremy_kJ Online
        jeremy_kJ Online
        jeremy_k
        wrote on last edited by jeremy_k
        #9

        This might fall into that lambda exception I hinted at. If self is a QGraphicsItem, that isn't derived from QObject, and as such doesn't get the automatic disconnection behavior.

        https://doc.qt.io/qt-6/qobject.html#connect-4 is the C++ equivalent.

        Asking a question about code? http://eel.is/iso-c++/testcase/

        D 1 Reply Last reply
        1
        • eyllanescE Offline
          eyllanescE Offline
          eyllanesc
          wrote on last edited by
          #10

          I see that many users are trying to help but because of the little information they are throwing things to see if one hits the wall but if you want quality help then generate the minimum space: the MRE

          If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

          1 Reply Last reply
          0
          • jeremy_kJ jeremy_k

            This might fall into that lambda exception I hinted at. If self is a QGraphicsItem, that isn't derived from QObject, and as such doesn't get the automatic disconnection behavior.

            https://doc.qt.io/qt-6/qobject.html#connect-4 is the C++ equivalent.

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

            @jeremy_k said in Pyside6 how to disconnect connection?:

            This might fall into that lambda exception I hinted at. If self is a QGraphicsItem, that isn't derived from QObject, and as such doesn't get the automatic disconnection behavior.

            https://doc.qt.io/qt-6/qobject.html#connect-4 is the C++ equivalent.

            I think that you are right. QGraphicsItem is not QObject, thus it does not have auto clean up functionality. I believe that's why I have to manually clean up connections.

            eyllanescE 1 Reply Last reply
            0
            • eyllanescE Offline
              eyllanescE Offline
              eyllanesc
              wrote on last edited by
              #12

              Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

              If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

              D 1 Reply Last reply
              0
              • eyllanescE eyllanesc

                Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

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

                @eyllanesc said in Pyside6 how to disconnect connection?:

                Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

                This is frustrating... I miss C++ aff!
                So shibokeh delete the C++ obejct, how do I delete python Object? del self ?

                eyllanescE jeremy_kJ 2 Replies Last reply
                0
                • D Dariusz

                  @jeremy_k said in Pyside6 how to disconnect connection?:

                  This might fall into that lambda exception I hinted at. If self is a QGraphicsItem, that isn't derived from QObject, and as such doesn't get the automatic disconnection behavior.

                  https://doc.qt.io/qt-6/qobject.html#connect-4 is the C++ equivalent.

                  I think that you are right. QGraphicsItem is not QObject, thus it does not have auto clean up functionality. I believe that's why I have to manually clean up connections.

                  eyllanescE Offline
                  eyllanescE Offline
                  eyllanesc
                  wrote on last edited by
                  #14

                  @Dariusz The connection you show is not made by the QGraphicsItem but by the scene, so the one that removes the connection in the last instance is the scene.

                  If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                  jeremy_kJ 1 Reply Last reply
                  0
                  • D Dariusz

                    @eyllanesc said in Pyside6 how to disconnect connection?:

                    Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

                    This is frustrating... I miss C++ aff!
                    So shibokeh delete the C++ obejct, how do I delete python Object? del self ?

                    eyllanescE Offline
                    eyllanescE Offline
                    eyllanesc
                    wrote on last edited by eyllanesc
                    #15

                    @Dariusz said in Pyside6 how to disconnect connection?:
                    In python you can't delete an object, del only deletes the variable name but not the object(the memory space). I don't understand why deleting an item must imply deleting the connection that is in the scope of the scene.

                    If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                    1 Reply Last reply
                    0
                    • D Dariusz

                      @eyllanesc said in Pyside6 how to disconnect connection?:

                      Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

                      This is frustrating... I miss C++ aff!
                      So shibokeh delete the C++ obejct, how do I delete python Object? del self ?

                      jeremy_kJ Online
                      jeremy_kJ Online
                      jeremy_k
                      wrote on last edited by
                      #16

                      @Dariusz said in Pyside6 how to disconnect connection?:

                      @eyllanesc said in Pyside6 how to disconnect connection?:

                      Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

                      This is frustrating... I miss C++ aff!
                      So shibokeh delete the C++ obejct, how do I delete python Object? del self ?

                      That, or remove all references to the item. If the object isn't referenced via a variable that is in scope somewhere else, the python garbage collector should eventually clean up.

                      Asking a question about code? http://eel.is/iso-c++/testcase/

                      eyllanescE 1 Reply Last reply
                      0
                      • jeremy_kJ jeremy_k

                        @Dariusz said in Pyside6 how to disconnect connection?:

                        @eyllanesc said in Pyside6 how to disconnect connection?:

                        Note: Using shiboken2.delete does not remove the python object (the wrapper) but only the handled C++ object.

                        This is frustrating... I miss C++ aff!
                        So shibokeh delete the C++ obejct, how do I delete python Object? del self ?

                        That, or remove all references to the item. If the object isn't referenced via a variable that is in scope somewhere else, the python garbage collector should eventually clean up.

                        eyllanescE Offline
                        eyllanescE Offline
                        eyllanesc
                        wrote on last edited by
                        #17

                        @jeremy_k Exactly, that's why I think the OP has an XY problem

                        If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                        D 1 Reply Last reply
                        0
                        • eyllanescE eyllanesc

                          @jeremy_k Exactly, that's why I think the OP has an XY problem

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

                          @eyllanesc said in Pyside6 how to disconnect connection?:

                          @jeremy_k Exactly, that's why I think the OP has an XY problem

                          Well the initial signal problem is now solved. Since I delete items and scene remain active, scene does not clean up connections. So I have to manually clean them up.

                          My second problem is how to properly delete a qgraphicsitem with its children in python. Perhaps I should make another topic for that as this one has solved my main issue.

                          eyllanescE 1 Reply Last reply
                          0
                          • D Dariusz

                            @eyllanesc said in Pyside6 how to disconnect connection?:

                            @jeremy_k Exactly, that's why I think the OP has an XY problem

                            Well the initial signal problem is now solved. Since I delete items and scene remain active, scene does not clean up connections. So I have to manually clean them up.

                            My second problem is how to properly delete a qgraphicsitem with its children in python. Perhaps I should make another topic for that as this one has solved my main issue.

                            eyllanescE Offline
                            eyllanescE Offline
                            eyllanesc
                            wrote on last edited by
                            #19

                            @Dariusz I don't understand how you have solved your current problem, and so far I don't understand what the connection (or disconnection) of the pinReleaseEvent signal of the scene has to do with the elimination of an item since they are 2 different objects. If anyone understands please explain it to me

                            If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                            1 Reply Last reply
                            1
                            • eyllanescE eyllanesc

                              @Dariusz The connection you show is not made by the QGraphicsItem but by the scene, so the one that removes the connection in the last instance is the scene.

                              jeremy_kJ Online
                              jeremy_kJ Online
                              jeremy_k
                              wrote on last edited by
                              #20

                              @eyllanesc said in Pyside6 how to disconnect connection?:

                              @Dariusz The connection you show is not made by the QGraphicsItem but by the scene, so the one that removes the connection in the last instance is the scene.

                              The issue is that the QGraphicsItem is on the receiving end of the connection, and is effectively captured. The caller doesn't know that the captured item is no longer valid, leading to an invalid condition at call time. In C++, it would be undefined behavior. I don't know what the python terminology is.

                              Generic C++ example:

                              int *i = new int;
                              *i = 0;
                              auto f = [i]() { *i++; };
                              delete i;
                              f();
                              

                              Asking a question about code? http://eel.is/iso-c++/testcase/

                              eyllanescE 1 Reply Last reply
                              0
                              • jeremy_kJ jeremy_k

                                @eyllanesc said in Pyside6 how to disconnect connection?:

                                @Dariusz The connection you show is not made by the QGraphicsItem but by the scene, so the one that removes the connection in the last instance is the scene.

                                The issue is that the QGraphicsItem is on the receiving end of the connection, and is effectively captured. The caller doesn't know that the captured item is no longer valid, leading to an invalid condition at call time. In C++, it would be undefined behavior. I don't know what the python terminology is.

                                Generic C++ example:

                                int *i = new int;
                                *i = 0;
                                auto f = [i]() { *i++; };
                                delete i;
                                f();
                                
                                eyllanescE Offline
                                eyllanescE Offline
                                eyllanesc
                                wrote on last edited by
                                #21

                                @jeremy_k The question is the following: in bindings such as PySide or PyQt, the ownership of the items is held by the scene, so when you remove the item from the scene then the item has no ownership and is eventually removed by the python GC (python is not C++), and at the time the GC removes the python object it also removes its connections.

                                If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                                D 1 Reply Last reply
                                0
                                • eyllanescE eyllanesc

                                  @jeremy_k The question is the following: in bindings such as PySide or PyQt, the ownership of the items is held by the scene, so when you remove the item from the scene then the item has no ownership and is eventually removed by the python GC (python is not C++), and at the time the GC removes the python object it also removes its connections.

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

                                  @eyllanesc said in Pyside6 how to disconnect connection?:

                                  @jeremy_k The question is the following: in bindings such as PySide or PyQt, the ownership of the items is held by the scene, so when you remove the item from the scene then the item has no ownership and is eventually removed by the python GC (python is not C++), and at the time the GC removes the python object it also removes its connections.

                                  Unles signal holds a pointer to object and thus it will never get deleted... since scene didn't disconnect the signal since scene.removeItem() does not delete the item, nor item is QObject so its treated as lambda function (I guess?) as @jeremy_k suggested...

                                  eyllanescE 1 Reply Last reply
                                  0
                                  • D Dariusz

                                    @eyllanesc said in Pyside6 how to disconnect connection?:

                                    @jeremy_k The question is the following: in bindings such as PySide or PyQt, the ownership of the items is held by the scene, so when you remove the item from the scene then the item has no ownership and is eventually removed by the python GC (python is not C++), and at the time the GC removes the python object it also removes its connections.

                                    Unles signal holds a pointer to object and thus it will never get deleted... since scene didn't disconnect the signal since scene.removeItem() does not delete the item, nor item is QObject so its treated as lambda function (I guess?) as @jeremy_k suggested...

                                    eyllanescE Offline
                                    eyllanescE Offline
                                    eyllanesc
                                    wrote on last edited by eyllanesc
                                    #23

                                    @Dariusz To provide what I indicate I can provide a MWE, where every 1 second a signal is emitted and that is connected to an item, in the fifth second the item is removed but it does not cause any error.

                                    from PySide6 import QtCore, QtWidgets
                                    
                                    
                                    class FooItem(QtWidgets.QGraphicsEllipseItem):
                                        def foo_slot(self):
                                            print("slot")
                                    
                                    
                                    class Scene(QtWidgets.QGraphicsScene):
                                        fooSignal = QtCore.Signal()
                                    
                                    
                                    class View(QtWidgets.QGraphicsView):
                                        def __init__(self, parent=None):
                                            super().__init__(parent)
                                    
                                            scene = Scene(self)
                                            self.setScene(scene)
                                    
                                            timer = QtCore.QTimer(self, interval=1000)
                                            timer.timeout.connect(self.scene().fooSignal)
                                            timer.start()
                                    
                                            item = FooItem()
                                            self.scene().addItem(item)
                                    
                                            self.scene().fooSignal.connect(item.foo_slot)
                                    
                                            QtCore.QTimer.singleShot(5000, self.remove_item)
                                    
                                        def remove_item(self):
                                            items = self.scene().items()
                                            if items:
                                                item = items[0]
                                                self.scene().removeItem(item)
                                    
                                    
                                    if __name__ == "__main__":
                                        app = QtWidgets.QApplication([])
                                        w = View()
                                        w.show()
                                        app.exec_()
                                    

                                    Output:

                                    slot
                                    slot
                                    slot
                                    slot
                                    slot
                                    

                                    If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                                    D 1 Reply Last reply
                                    1
                                    • eyllanescE eyllanesc

                                      @Dariusz To provide what I indicate I can provide a MWE, where every 1 second a signal is emitted and that is connected to an item, in the fifth second the item is removed but it does not cause any error.

                                      from PySide6 import QtCore, QtWidgets
                                      
                                      
                                      class FooItem(QtWidgets.QGraphicsEllipseItem):
                                          def foo_slot(self):
                                              print("slot")
                                      
                                      
                                      class Scene(QtWidgets.QGraphicsScene):
                                          fooSignal = QtCore.Signal()
                                      
                                      
                                      class View(QtWidgets.QGraphicsView):
                                          def __init__(self, parent=None):
                                              super().__init__(parent)
                                      
                                              scene = Scene(self)
                                              self.setScene(scene)
                                      
                                              timer = QtCore.QTimer(self, interval=1000)
                                              timer.timeout.connect(self.scene().fooSignal)
                                              timer.start()
                                      
                                              item = FooItem()
                                              self.scene().addItem(item)
                                      
                                              self.scene().fooSignal.connect(item.foo_slot)
                                      
                                              QtCore.QTimer.singleShot(5000, self.remove_item)
                                      
                                          def remove_item(self):
                                              items = self.scene().items()
                                              if items:
                                                  item = items[0]
                                                  self.scene().removeItem(item)
                                      
                                      
                                      if __name__ == "__main__":
                                          app = QtWidgets.QApplication([])
                                          w = View()
                                          w.show()
                                          app.exec_()
                                      

                                      Output:

                                      slot
                                      slot
                                      slot
                                      slot
                                      slot
                                      
                                      D Offline
                                      D Offline
                                      Dariusz
                                      wrote on last edited by
                                      #24

                                      @eyllanesc You are right, this works as it should. I must have more issues elsewhere and the "disconnect" signal solution I found must not be fixing the larger issue I have :- (

                                      eyllanescE 1 Reply Last reply
                                      0
                                      • jeremy_kJ Online
                                        jeremy_kJ Online
                                        jeremy_k
                                        wrote on last edited by
                                        #25

                                        The code I had issues with, using PyQt5, is:

                                        from PyQt5.QtCore import QObject
                                        obj1 = QObject()
                                        obj2 = QObject()
                                        obj1.destroyed.connect(lambda: obj2.deleteLater())
                                        del obj2
                                        del obj1
                                        

                                        Here, the capture is explicit, and the punishment is swift:

                                        Traceback (most recent call last):
                                        File "<stdin>", line 1, in <lambda>
                                        NameError: name 'obj2' is not defined
                                        Abort trap: 6
                                        

                                        Asking a question about code? http://eel.is/iso-c++/testcase/

                                        eyllanescE SGaistS 2 Replies Last reply
                                        0
                                        • D Dariusz

                                          @eyllanesc You are right, this works as it should. I must have more issues elsewhere and the "disconnect" signal solution I found must not be fixing the larger issue I have :- (

                                          eyllanescE Offline
                                          eyllanescE Offline
                                          eyllanesc
                                          wrote on last edited by
                                          #26

                                          @Dariusz That is why I say that it provides an MRE, you will not expect the community to be crazy throwing papers on the wall waiting for one to stick.

                                          If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                                          D 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