Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-7652

Deleting a gesture target QGraphicsObject during a gesture sequence will cause a crash in graphics scene

XMLWordPrintable

    • 734ba1f540aaedc4a3558268bd7350c0b15325a4

      If a QGraphicsObject which is a recipient of gesture events gets deleted during a gesture sequence (it has accepted GestureStarted but gets deleted before GestureFinished or GestureCanceled) there will be a crash ("The inferior stopped because it received a signal from the Operating System. Signal name: SIGSEGV, Signal meaning: Segmentation fault") in qgraphicsitem.cpp:

      /*!
        \since 4.6
      
        Return the graphics item cast to a QGraphicsObject, if the class is actually a
        graphics object, 0 otherwise.
      */
      QGraphicsObject *QGraphicsItem::toGraphicsObject()
      {
          return d_ptr->isObject ? static_cast<QGraphicsObject *>(this) : 0;   // <-- crashes because d_ptr is a null pointer
      }
      

      Apparently the gesture event dispatching system doesn't take into account that the target may not exist anymore.

      NOTE ON THE AUTOTEST:

      I was unable to reproduce the exact same crash with the autotest using QTest::touchEvent. The test will nonetheless crash albeit the crash is not the one described above. I was able to reproduce the exact same crash with the autotest when running it on Qt Creator if I inserted a breakpoint somewhere in the gesture event handling function (try line 96 for example). Therefore I have also included a manual test where you can reproduce the crash described above. To do this, press and move within the inner rectangle of the test program.

        1. deletegesturetarget-autotest.zip
          2 kB
          Jaakko Korpela
        2. deletegesturetarget.zip
          2 kB
          Jaakko Korpela
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

            dzyubenk Denis Dzyubenko (Inactive)
            jaakkorp Jaakko Korpela
            Votes:
            4 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved:

                There are no open Gerrit changes