mouseEventsの間にQDockWidgetの親を変更することに関連する同様の問題がありました。ここで私がQtのデバッグと私が思いついた解決策から学んだのは、私はとにかく取っていないことです。それをしないと、他の望ましくないQtの動作が起こります。
私がしたことは、 "再育成"の前にMouseMoveイベントを送信してから、再び "ドラッグ"メカニズムをトリガーすることでした。これはQDockWidgetsに固有のものでしたが、これがあなたの状況に当てはまるかどうかわかりません。しかし、ここに関連するコードは次のとおりです。
// 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);
あなたはあなたの特定のケースで何が起こっているかを完全に理解するために、いくつかのQtのコードをデバッグする必要があります。そして、これでは不十分であるかのように、異なるQtのバージョンも異なって動作するかもしれません。
わかりますように、私はこれをやって "楽しい"をたくさん持っていました。だから幸運とQForceはあなたと一緒にいるかもしれません。
親スイッチのハックの代わりにドラッグアンドドロップを使用するように思えます。 – thuga