If parent is removed after child - you're right,
but if parent is removed first(and removes child) and then child is removed explicitly, then we have wrong pointer there.
And what if both generate deleteLater events on hide?
Is it managed on the level of event loop?
If hide event is called on parent, it calls hide on child, and both generates deleteLater events,
so if then delete event of parent would be processed (and delete also child), child's delete event is already queued...


One more thing worth a check is creating widget normally embedded in mdi sub window without it (just create & show standalone) and delete it (via delete, deleteLater or close with DeleteOnClose attrib) and see if problem isn't inside of that widget.

By the way wysota,
Great article about undo/redo framework in qt quarterly