我有一個類似的問題,涉及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