Ich hatte ein ähnliches Problem mit dem Ändern einer QDockWidget Eltern während MausEreignisse. Hier ist, was ich aus dem Debuggen von Qt und der Lösung gelernt habe, die ich mir ausgedacht habe, und am Ende habe ich es trotzdem nicht genommen: Tu es nicht, es wird anderes unerwünschtes Qt-Verhalten verursachen.
Was ich tat, war MouseMove-Ereignisse vor dem "Erneutes Elternteil" zu senden und danach, um den "Ziehen" -Mechanismus erneut auszulösen (weil das erneute Erziehen es aufhörte). Dies war spezifisch für QDockWidgets, ich bin mir nicht sicher, ob dies auf Ihre Situation zutrifft. Allerdings ist hier der entsprechende Code:
// end the drag before re-parenting
QMouseEvent endDrag(QEvent::NonClientAreaMouseMove, QCursor::pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
const bool handledEndDrag = QApplication::sendEvent(&dockWidget, &endDrag);
assert(handledEndDrag);
// set this attribute to avoid a hide()-event spoiling the drag-and-drop
dockWidget.setAttribute(Qt::WA_WState_Hidden, true);
// ... do re-parenting
dockWidget.setAttribute(Qt::WA_WState_Hidden, false);
// trigger start drag again
QMouseEvent* startDrag =
new QMouseEvent(QEvent::NonClientAreaMouseButtonPress, dockWidget.mapFromGlobal(QCursor::pos()),
Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers());
QApplication::postEvent(&dockWidget, startDrag);
// fake this mouse move event to continue dragging
QMouseEvent mouseMove(QEvent::MouseMove, current->pos(), current->pos(), Qt::NoButton,
QApplication::mouseButtons(), QApplication::keyboardModifiers());
const bool handledMouseMove = QApplication::sendEvent(m_dock, &mouseMove);
assert(handledMouseMove);
Sie haben einige Qt-Code, um zu debuggen, vollständig zu verstehen, was in Ihrem speziellen Fall vor sich geht. Und als ob das nicht genug wäre: Verschiedene Qt-Versionen könnten sich auch anders verhalten.
Wie Sie sehen können, hatte ich eine Menge "Spaß" dabei. Also viel Glück und möge die QForce bei dir sein.
Es scheint, als ob Sie Drag & Drop anstelle des Eltern-Switch-Hacks verwenden sollten. – thuga