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. Why is QGraphicsObject getting deleted in QCoreApplication event loop?
Forum Updated to NodeBB v4.3 + New Features

Why is QGraphicsObject getting deleted in QCoreApplication event loop?

Scheduled Pinned Locked Moved Unsolved General and Desktop
7 Posts 2 Posters 322 Views 2 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.
  • P Offline
    P Offline
    patrickkidd
    wrote on last edited by
    #1

    I have a QGraphicsObject that is getting deleted when I let the QApplication's event loop run for a little bit. I can reproduce this in a unit test. This is a PyQt5 app. The QGraphicsObject is not being removed from the QGraphicsScene, but a delete event is obviously getting posted for deferred deletion. There is about a ~500ms delay between calling QMessageBox::information (to let the event loop run a little) and the actual deletion. Here is C++ backtrace on macOS:

    I am emitting a signal from my PathItemBase (my QGraphicsObject subclass) so that I can set a python breakpoint on the deletion. The QObject::destroyed has not been emitted yet.

    C++ dtor:

    PathItemBase::~PathItemBase() {
        print_stack_trace();
        qDebug() << "~PathItemBase() objectName: " << this->objectName() << " className: " << this->metaObject()->className() << " parentItem: " << this->parentItem() << " parent: " << this->parent();
        emit deleting(this);
    }
    

    Python deleting slot:

            def _deleting(o):
                nonlocal self
    
                _log.info(
                    f">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ABOUT TO BE DESTROYED "
                    f"objectName: {o.objectName()}, className: {o.metaObject().className()}"
                )
                x = 1
    
            self.deleting.connect(_deleting)
    

    Which prints:

    C++ Stack trace:
    0   _pkdiagram.cpython-310-darwin.so    0x00000001090b6516 _Z17print_stack_tracev + 54
    1   _pkdiagram.cpython-310-darwin.so    0x00000001090bb0ef _ZN12PathItemBaseD2Ev + 47
    2   _pkdiagram.cpython-310-darwin.so    0x00000001090af23d _ZN15sipPathItemBaseD0Ev + 61
    3   QtCore                              0x000000028a93088e _ZN7QObject5eventEP6QEvent + 158
    4   _pkdiagram.cpython-310-darwin.so    0x00000001090af7d1 _ZN15sipPathItemBase5eventEP6QEvent + 113
    5   QtWidgets                           0x000000029671e9ea _ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 266
    6   QtWidgets                           0x000000029671fe11 _ZN12QApplication6notifyEP7QObjectP6QEvent + 497
    7   QtWidgets.abi3.so                   0x0000000296e89e06 _ZN15sipQApplication6notifyEP7QObjectP6QEvent + 230
    8   QtCore                              0x000000028a905a34 _ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent + 212
    9   QtCore                              0x000000028a906d79 _ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThreadData + 809
    10  QtCore                              0x000000028a969719 _ZN20QEventDispatcherUNIX13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 73
    11  libqoffscreen.dylib                 0x000000029983f74e _ZN23QUnixEventDispatcherQPA13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 14
    12  QtCore                              0x000000028a901acf _ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE + 431
    13  QtWidgets                           0x000000029691ee9e _ZN7QDialog4execEv + 526
    14  QtWidgets                           0x000000029695ca72 _ZL17showNewMessageBoxP7QWidgetN11QMessageBox4IconERK7QStringS5_6QFlagsINS1_14StandardButtonEES7_ + 354
    15  QtWidgets.abi3.so                   0x0000000296ef12f7 _ZL28meth_QMessageBox_informationP7_objectS0_S0_ + 231
    16  python3.10                          0x0000000106ca6045 cfunction_call + 69
    17  python3.10                          0x0000000106c5f218 _PyObject_MakeTpCall + 376
    18  python3.10                          0x0000000106d5228e call_function + 974
    19  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    20  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    21  python3.10                          0x0000000106c5f5eb PyVectorcall_Call + 155
    22  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    23  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    24  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    25  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    26  python3.10                          0x0000000106d5218a call_function + 714
    27  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    28  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    29  python3.10                          0x0000000106c61aed method_vectorcall + 205
    30  python3.10                          0x0000000106d5218a call_function + 714
    31  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    32  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    33  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
    34  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
    35  python3.10                          0x0000000106cc5e5c slot_tp_call + 204
    36  python3.10                          0x0000000106c5f218 _PyObject_MakeTpCall + 376
    37  python3.10                          0x0000000106d5228e call_function + 974
    38  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
    39  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    40  python3.10                          0x0000000106d5218a call_function + 714
    41  python3.10                          0x0000000106d4e94c _PyEval_EvalFrameDefault + 28716
    42  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    43  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    44  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    45  python3.10                          0x0000000106d5218a call_function + 714
    46  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    47  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    48  python3.10                          0x0000000106c61aed method_vectorcall + 205
    49  python3.10                          0x0000000106d5218a call_function + 714
    50  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    51  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    52  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
    53  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
    54  python3.10                          0x0000000106cc5e5c slot_tp_call + 204
    55  python3.10                          0x0000000106c5f73d _PyObject_Call + 141
    56  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    57  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    58  python3.10                          0x0000000106d5218a call_function + 714
    59  python3.10                          0x0000000106d47f5b _PyEval_EvalFrameDefault + 1595
    60  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    61  python3.10                          0x0000000106c61aed method_vectorcall + 205
    62  python3.10                          0x0000000106d5218a call_function + 714
    63  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
    64  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    65  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    66  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    67  python3.10                          0x0000000106d5218a call_function + 714
    68  python3.10                          0x0000000106d47f5b _PyEval_EvalFrameDefault + 1595
    69  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    70  python3.10                          0x0000000106d5218a call_function + 714
    71  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
    72  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    73  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    74  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    75  python3.10                          0x0000000106d5218a call_function + 714
    76  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    77  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    78  python3.10                          0x0000000106c61aed method_vectorcall + 205
    79  python3.10                          0x0000000106d5218a call_function + 714
    80  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    81  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    82  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
    83  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
    84  python3.10                          0x0000000106cc5e5c slot_tp_call + 204
    85  python3.10                          0x0000000106c5f218 _PyObject_MakeTpCall + 376
    86  python3.10                          0x0000000106d5228e call_function + 974
    87  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
    88  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    89  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
    90  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    91  python3.10                          0x0000000106d5218a call_function + 714
    92  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    93  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    94  python3.10                          0x0000000106c61aed method_vectorcall + 205
    95  python3.10                          0x0000000106d5218a call_function + 714
    96  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
    97  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
    98  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
    99  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
    2024-08-11 11:11:52,145 INFO :0                         ~PathItemBase() objectName:  "Marriage"  className:  PathItemBase  parentItem:  QGraphicsItem(0)  parent:  QObject(0x0)
    2024-08-11 11:11:52,146 INFO pathitem.py:104            >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ABOUT TO BE DESTROYED objectName: Marriage, className: PathItemBase
    

    Both QObject::parent() and QGraphicsItem::parentItem() return 0x0, so it shouldn't be a QObject parent-child hierarchy deletion. What else could post this deletion event?

    https://alaskafamilysystems.com/

    C 1 Reply Last reply
    0
    • P patrickkidd

      I have a QGraphicsObject that is getting deleted when I let the QApplication's event loop run for a little bit. I can reproduce this in a unit test. This is a PyQt5 app. The QGraphicsObject is not being removed from the QGraphicsScene, but a delete event is obviously getting posted for deferred deletion. There is about a ~500ms delay between calling QMessageBox::information (to let the event loop run a little) and the actual deletion. Here is C++ backtrace on macOS:

      I am emitting a signal from my PathItemBase (my QGraphicsObject subclass) so that I can set a python breakpoint on the deletion. The QObject::destroyed has not been emitted yet.

      C++ dtor:

      PathItemBase::~PathItemBase() {
          print_stack_trace();
          qDebug() << "~PathItemBase() objectName: " << this->objectName() << " className: " << this->metaObject()->className() << " parentItem: " << this->parentItem() << " parent: " << this->parent();
          emit deleting(this);
      }
      

      Python deleting slot:

              def _deleting(o):
                  nonlocal self
      
                  _log.info(
                      f">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ABOUT TO BE DESTROYED "
                      f"objectName: {o.objectName()}, className: {o.metaObject().className()}"
                  )
                  x = 1
      
              self.deleting.connect(_deleting)
      

      Which prints:

      C++ Stack trace:
      0   _pkdiagram.cpython-310-darwin.so    0x00000001090b6516 _Z17print_stack_tracev + 54
      1   _pkdiagram.cpython-310-darwin.so    0x00000001090bb0ef _ZN12PathItemBaseD2Ev + 47
      2   _pkdiagram.cpython-310-darwin.so    0x00000001090af23d _ZN15sipPathItemBaseD0Ev + 61
      3   QtCore                              0x000000028a93088e _ZN7QObject5eventEP6QEvent + 158
      4   _pkdiagram.cpython-310-darwin.so    0x00000001090af7d1 _ZN15sipPathItemBase5eventEP6QEvent + 113
      5   QtWidgets                           0x000000029671e9ea _ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 266
      6   QtWidgets                           0x000000029671fe11 _ZN12QApplication6notifyEP7QObjectP6QEvent + 497
      7   QtWidgets.abi3.so                   0x0000000296e89e06 _ZN15sipQApplication6notifyEP7QObjectP6QEvent + 230
      8   QtCore                              0x000000028a905a34 _ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent + 212
      9   QtCore                              0x000000028a906d79 _ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThreadData + 809
      10  QtCore                              0x000000028a969719 _ZN20QEventDispatcherUNIX13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 73
      11  libqoffscreen.dylib                 0x000000029983f74e _ZN23QUnixEventDispatcherQPA13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 14
      12  QtCore                              0x000000028a901acf _ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE + 431
      13  QtWidgets                           0x000000029691ee9e _ZN7QDialog4execEv + 526
      14  QtWidgets                           0x000000029695ca72 _ZL17showNewMessageBoxP7QWidgetN11QMessageBox4IconERK7QStringS5_6QFlagsINS1_14StandardButtonEES7_ + 354
      15  QtWidgets.abi3.so                   0x0000000296ef12f7 _ZL28meth_QMessageBox_informationP7_objectS0_S0_ + 231
      16  python3.10                          0x0000000106ca6045 cfunction_call + 69
      17  python3.10                          0x0000000106c5f218 _PyObject_MakeTpCall + 376
      18  python3.10                          0x0000000106d5228e call_function + 974
      19  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      20  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      21  python3.10                          0x0000000106c5f5eb PyVectorcall_Call + 155
      22  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      23  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      24  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      25  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      26  python3.10                          0x0000000106d5218a call_function + 714
      27  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      28  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      29  python3.10                          0x0000000106c61aed method_vectorcall + 205
      30  python3.10                          0x0000000106d5218a call_function + 714
      31  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      32  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      33  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
      34  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
      35  python3.10                          0x0000000106cc5e5c slot_tp_call + 204
      36  python3.10                          0x0000000106c5f218 _PyObject_MakeTpCall + 376
      37  python3.10                          0x0000000106d5228e call_function + 974
      38  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
      39  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      40  python3.10                          0x0000000106d5218a call_function + 714
      41  python3.10                          0x0000000106d4e94c _PyEval_EvalFrameDefault + 28716
      42  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      43  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      44  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      45  python3.10                          0x0000000106d5218a call_function + 714
      46  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      47  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      48  python3.10                          0x0000000106c61aed method_vectorcall + 205
      49  python3.10                          0x0000000106d5218a call_function + 714
      50  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      51  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      52  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
      53  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
      54  python3.10                          0x0000000106cc5e5c slot_tp_call + 204
      55  python3.10                          0x0000000106c5f73d _PyObject_Call + 141
      56  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      57  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      58  python3.10                          0x0000000106d5218a call_function + 714
      59  python3.10                          0x0000000106d47f5b _PyEval_EvalFrameDefault + 1595
      60  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      61  python3.10                          0x0000000106c61aed method_vectorcall + 205
      62  python3.10                          0x0000000106d5218a call_function + 714
      63  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
      64  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      65  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      66  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      67  python3.10                          0x0000000106d5218a call_function + 714
      68  python3.10                          0x0000000106d47f5b _PyEval_EvalFrameDefault + 1595
      69  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      70  python3.10                          0x0000000106d5218a call_function + 714
      71  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
      72  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      73  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      74  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      75  python3.10                          0x0000000106d5218a call_function + 714
      76  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      77  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      78  python3.10                          0x0000000106c61aed method_vectorcall + 205
      79  python3.10                          0x0000000106d5218a call_function + 714
      80  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      81  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      82  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
      83  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
      84  python3.10                          0x0000000106cc5e5c slot_tp_call + 204
      85  python3.10                          0x0000000106c5f218 _PyObject_MakeTpCall + 376
      86  python3.10                          0x0000000106d5228e call_function + 974
      87  python3.10                          0x0000000106d4ea29 _PyEval_EvalFrameDefault + 28937
      88  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      89  python3.10                          0x0000000106d4ee65 _PyEval_EvalFrameDefault + 30021
      90  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      91  python3.10                          0x0000000106d5218a call_function + 714
      92  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      93  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      94  python3.10                          0x0000000106c61aed method_vectorcall + 205
      95  python3.10                          0x0000000106d5218a call_function + 714
      96  python3.10                          0x0000000106d4e978 _PyEval_EvalFrameDefault + 28760
      97  python3.10                          0x0000000106d477f2 _PyEval_Vector + 146
      98  python3.10                          0x0000000106c5efee _PyObject_FastCallDictTstate + 174
      99  python3.10                          0x0000000106c5fa9b _PyObject_Call_Prepend + 139
      2024-08-11 11:11:52,145 INFO :0                         ~PathItemBase() objectName:  "Marriage"  className:  PathItemBase  parentItem:  QGraphicsItem(0)  parent:  QObject(0x0)
      2024-08-11 11:11:52,146 INFO pathitem.py:104            >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ABOUT TO BE DESTROYED objectName: Marriage, className: PathItemBase
      

      Both QObject::parent() and QGraphicsItem::parentItem() return 0x0, so it shouldn't be a QObject parent-child hierarchy deletion. What else could post this deletion event?

      C Offline
      C Offline
      ChrisW67
      wrote on last edited by
      #2

      @patrickkidd said in Why is QGraphicsObject getting deleted in QCoreApplication event loop?:

      I can reproduce this in a unit test.

      Then you should post the unit test so we can see exactly what you are doing.

      1 Reply Last reply
      0
      • P Offline
        P Offline
        patrickkidd
        wrote on last edited by
        #3

        OK, but it's a fairly mature and complex app and there is a lot going on here. I bet this problem is best taken hypothetically, like when could a QGraphicsItem possibly get a deferred delete call if it isn't getting explicitly removed from the scene or anything.

        But here is the unit/integration test:

        https://github.com/patrickkidd/familydiagram/blob/cf161d739c01747c52756dba9f2b64ed68f80c51/tests/test_addanythingdialog_scripts.py#L292

        https://alaskafamilysystems.com/

        C 1 Reply Last reply
        0
        • P patrickkidd

          OK, but it's a fairly mature and complex app and there is a lot going on here. I bet this problem is best taken hypothetically, like when could a QGraphicsItem possibly get a deferred delete call if it isn't getting explicitly removed from the scene or anything.

          But here is the unit/integration test:

          https://github.com/patrickkidd/familydiagram/blob/cf161d739c01747c52756dba9f2b64ed68f80c51/tests/test_addanythingdialog_scripts.py#L292

          C Offline
          C Offline
          ChrisW67
          wrote on last edited by
          #4

          You are right, the test is not much use. It is a not a small, self-contained demonstration of the behaviour.

          The QGraphicsObject will be destroyed when the QGraphicsScene containing it is destroyed. This is using the QGraphicsItem hierarchy, not the QObject hierarchy.

          In a Python environment, using QGraphicsScene::removeItem() will probably result in removed items being garbage collected at a later point in time if you are not holding other references. QGraphicsScene::clear() will delete all items in the scene.

          1 Reply Last reply
          0
          • P Offline
            P Offline
            patrickkidd
            wrote on last edited by
            #5

            Yeah, I still have references in python, and in fact I first discovered this problem because PyQt was complaining about the underlying C++ object being deleted from a still valid python reference.

            The QGraphicsScene isn't being destroyed so far as I can tell. The QGraphicsScene.destroyed signal never gets emitted and removeItem is never called. I've been using Qt for 25 years and this is such a strange bug. How in the world could the QGraphicsItem be getting deleted, and not only that but in a deferred way??

            I can debug the test with lldb and then set a breakpoint in QObject::deleteLater() (I am using the pip-installed PyQt5 bins on macOS and they accurately reflect the C++ object attrs) but I can't figure out how to set a lldb breakpoint condition for when the classname is "PathItemBase", or at least not QQml*.

            https://alaskafamilysystems.com/

            1 Reply Last reply
            0
            • P Offline
              P Offline
              patrickkidd
              wrote on last edited by
              #6

              I wonder, could this possibly have something to do with the QGraphicsObject getting deleted being garbage collected from a reference in the Qml JS engine?

              https://alaskafamilysystems.com/

              1 Reply Last reply
              0
              • P Offline
                P Offline
                patrickkidd
                wrote on last edited by patrickkidd
                #7

                I need more time testing, but it looks like setting object ownership to C++ when a Object is returned from a pyqt slot like this:

                    @pyqtSlot(int, result=QObject)
                    def item(self, id):
                        ret = self.scene.findById(id)
                        QQmlEngine.setObjectOwnership(ret, QQmlEngine.CppOwnership)
                        return ret
                

                fixes it. I can't figure out where to find this in the docs, but a fresh ChatGPT 4 thread says that default ownership by objects returned to calls from QMl/javascript is to javascript and not python/C++.

                Man, that was a tough and strange one. I would really love to find a place in the Qt JS engine where the deleteLater is called.

                https://alaskafamilysystems.com/

                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