在 QMainWindows 之间拖动 QDockWidgets
Posted
技术标签:
【中文标题】在 QMainWindows 之间拖动 QDockWidgets【英文标题】:Dragging QDockWidgets between QMainWindows 【发布时间】:2016-05-19 04:43:14 【问题描述】:我有一个关于 的问题。我有一个具有不同“DockAreas”的应用程序,它有一个带有一个或多个 QDockWidgets 的 QMainWindow 成员。此外,我想让 QDockWidgets 可以拖放到其他已经浮动的 QDockWidgets 中(不是选项卡!)。
为了在拖放时获得良好的悬停效果,浮动 QDockWidget 嵌入到我的 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,我必须让它再次浮动并以某种方式“继续拖动”
我愿意接受任何新的建议 :) 提前谢谢您!
【问题讨论】:
现在在他们的错误跟踪器上打开了一个问题:bugreports.qt.io/browse/QTBUG-64595 【参考方案1】:我现在正在努力解决同样的问题并想分享。
我发现这个论坛帖子处理同样的问题:http://www.qtcentre.org/threads/41847-Dragging-QDockWidgets-between-QMainWindows 然而,这个解决方案是有缺陷的:如果你允许 Dockables 浮动,它就不能正常工作。当您进入另一个窗口并仍然拖动 QDockWidget 时,enterEvent 并不会真正触发。它只在发布后触发。
我也要去重新养育子女 (1)。当您还希望允许在 Window 内重新排列 QDockWidget 时,QDrag 似乎有问题。
我认为通过对拖动的 QDockWidget 的放下/释放做出反应可以正确地做到这一点。但我找不到这方面的事件或信号。
【讨论】:
以上是关于在 QMainWindows 之间拖动 QDockWidgets的主要内容,如果未能解决你的问题,请参考以下文章