在QMainWindows之间拖动QDockWidgets

Cpp*_*ris 7 c++ qt drag-and-drop qdockwidget qt5

我有一个关于在QMainWindows之间拖动QDockWidgets的问题.我有一个具有不同"DockAreas"的应用程序,它有一个带有一个或多个QDockWidgets的QMainWindow成员.另外,我想让QDockWidgets可以拖放到其他已经浮动的QDockWidgets(没有标签!).

为了在拖放时获得漂亮的悬停效果,浮动QDockWidgets嵌入到具有QMainWindow成员的DockArea的新实例中.现在我拦截拖动的QDockWidget的mousemove事件,并在它悬停在我的DockArea的另一个QMainWindow时更改其父级.不幸的是,这会导致崩溃,看起来这个QDockWidget所在的原始QLayoutItem已经消失了.

void QDockWidgetPrivate::moveEvent(QMoveEvent *event)
{
    // ...
    // now this widgetItem member of state is kaputt
    layout->hover(state->widgetItem, globalMousePos);
}
Run Code Online (Sandbox Code Playgroud)

我发现了在互联网上QMainWindows之间拖放QDockWidgets的不同建议:

1)重新养育 - 这就是我正在尝试的东西

2)QDrag - 对我不起作用,async exec()打破了我的应用程序,最后我还是要重新调试

3)调用新QMainWindow的addDockWidget(...) - 停靠QDockWidget,我将不得不再次浮动并以某种方式"继续拖动"

我对任何新建议持开放态度:)提前谢谢!

Gab*_*ber 0

我现在正在努力解决同样的问题并想分享。

Ich 发现这个论坛帖子处理同样的问题:http://www.qtcentre.org/threads/41847-Dragging-QDockWidgets- Between-QMainWindows 然而,这个解决方案是有缺陷的:如果您允许 Dockables,它就无法正常工作是浮动的。当您进入另一个窗口并仍然拖动 QDockWidget 时,enterEvent 实际上并不会触发。仅在释放后触发。

我还要重新调整(1)。当您还想允许在窗口内重新排列 QDockWidget 时,QDrag 似乎有问题。

我认为人们可以通过对拖动的 QDockWidget 的放置/释放做出反应来正确地做到这一点。但我找不到这方面的事件或信号。