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 12.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 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 Offline
      jeremy_kJ Offline
      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.

        D 1 Reply Last reply
        0
        • jeremy_kJ jeremy_k

          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
          
          eyllanescE Offline
          eyllanescE Offline
          eyllanesc
          wrote on last edited by eyllanesc
          #27

          @jeremy_k First of all GC only removes the objects that have no references.

          The problem is very different, in principle when deleteLater is called it deletes the C ++ object and then a reference to the python object is eliminated, if it no longer has references the object would be eliminated as I already indicated, but in your particular case the lambda method has a scope so it has a reference and therefore the python object (the wrapper) will not be eliminated but the C ++ object

          eyllanescE 1 Reply Last reply
          0
          • eyllanescE eyllanesc

            @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.

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

            @eyllanesc said in Pyside6 how to disconnect connection?:

            @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.

            Yes I understand your point, however, the app I'm working on has 150+ files and few thousand lines of code... Doing simple example usually "solve my issues", but my issues are not simple and solving them is quite "hard"... so I'm trying to ask for a "simple" answer to the question like... how to properly disconnect a signal if I have to do it manually and I don't want to rely on automatic qt logic... I guess I'm "old fashion" I like to manage my memory myself and python is a bit... "leme do it memememe" and I never know if he does it or not :- )

            eyllanescE 1 Reply Last reply
            0
            • eyllanescE eyllanesc

              @jeremy_k First of all GC only removes the objects that have no references.

              The problem is very different, in principle when deleteLater is called it deletes the C ++ object and then a reference to the python object is eliminated, if it no longer has references the object would be eliminated as I already indicated, but in your particular case the lambda method has a scope so it has a reference and therefore the python object (the wrapper) will not be eliminated but the C ++ object

              eyllanescE Offline
              eyllanescE Offline
              eyllanesc
              wrote on last edited by
              #29
              This post is deleted!
              1 Reply Last reply
              0
              • D Dariusz

                @eyllanesc said in Pyside6 how to disconnect connection?:

                @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.

                Yes I understand your point, however, the app I'm working on has 150+ files and few thousand lines of code... Doing simple example usually "solve my issues", but my issues are not simple and solving them is quite "hard"... so I'm trying to ask for a "simple" answer to the question like... how to properly disconnect a signal if I have to do it manually and I don't want to rely on automatic qt logic... I guess I'm "old fashion" I like to manage my memory myself and python is a bit... "leme do it memememe" and I never know if he does it or not :- )

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

                @Dariusz Since you use thousands of files I suppose you use some system that manages versions like GIT and then rollback to the point that it does not generate problems, then implement the basic functionality in a minimal project where you can handle all the tests, then make a branch of the original project and at that time you just implemented the new functionality already tested.

                D 1 Reply Last reply
                0
                • eyllanescE eyllanesc

                  @Dariusz Since you use thousands of files I suppose you use some system that manages versions like GIT and then rollback to the point that it does not generate problems, then implement the basic functionality in a minimal project where you can handle all the tests, then make a branch of the original project and at that time you just implemented the new functionality already tested.

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

                  @eyllanesc Yes thats true. I would have to roll back 5 years and try to unpack the crazy system I build while learning how to code :- ). Well actually its what I'm doing now... a grand refactor rebuilding every piece of the app... Just trying to wrap my head around some odd crashes that I get with graphics views. Maybe I'm overdoing my memory managment and I should just... let it all be. hmmmm

                  eyllanescE 1 Reply Last reply
                  0
                  • D Dariusz

                    @eyllanesc Yes thats true. I would have to roll back 5 years and try to unpack the crazy system I build while learning how to code :- ). Well actually its what I'm doing now... a grand refactor rebuilding every piece of the app... Just trying to wrap my head around some odd crashes that I get with graphics views. Maybe I'm overdoing my memory managment and I should just... let it all be. hmmmm

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

                    @Dariusz You say: I build while learning how to code, you are crazy because no one should refactor code if they do not know the technology since you are going to make the same mistake as the previous programmer. Goodbye since your case is a hopeless case that will not have a solution since the forum is a site that has little space for a problem as big as the one you have.

                    1 Reply Last reply
                    0
                    • jeremy_kJ jeremy_k

                      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
                      
                      SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #33

                      Hi,

                      @jeremy_k said in Pyside6 how to disconnect connection?:

                      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

                      One of the main issue here is that you destroy obj2 before obj1. So it's likely garbage collected before obj1 is deleted hence the call to deleteLater will fail.

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

                      jeremy_kJ 1 Reply Last reply
                      2
                      • SGaistS SGaist

                        Hi,

                        @jeremy_k said in Pyside6 how to disconnect connection?:

                        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

                        One of the main issue here is that you destroy obj2 before obj1. So it's likely garbage collected before obj1 is deleted hence the call to deleteLater will fail.

                        jeremy_kJ Offline
                        jeremy_kJ Offline
                        jeremy_k
                        wrote on last edited by jeremy_k
                        #34

                        I guess I provided inadequate subtext for that example. It's documentation in a project I work on, explaining that qObject.signal.connect(lambda: anotherQObject.function(arg)) is unsafe in PyQt if anotherQObject might be destroyed before qObject. The same would happen in C++ with QObject::connect(qObject, &MyClass::signal, [&]() { anotherQObject->function(arg); });

                        In C++, one possible solution is to use QObject::Connect(sender, signal, context object, functor). To the best of my knowledge In PyQt5, and I suspect in PySide2/Qt for Python, there is no equivalent. You can write one by taking the connection object returned by object.signal.connect() and using it in a slot connected to anotherQObject.destroyed.

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

                        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