在QMainWindows

时间:2016-02-09 09:12:59

标签: c++ qt drag-and-drop qt5 qdockwidget

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

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

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

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

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

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

3)调用新QMainWindow的addDockWidget(...) - 停靠QDockWidget,我必须让它再次浮动并以某种方式“继续拖动”

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

1 个答案:

答案 0 :(得分:0)

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

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

我也在进行重新定位(1)。当您还想允许在窗口中重新排列QDockWidget时,QDrag似乎有问题。

我认为通过对拖动的QDockWidget的删除/释放作出反应,可以正确地做到这一点。但我找不到这样的事件或信号。