我有一个关于在 QMainWindows 之间拖动 QDockWidgets 的问题。我有一个具有不同“DockAreas”的应用程序,它有一个 QMainWindow 成员和一个或多个 QDockWidgets。此外,我想让 QDockWidgets 可以拖放到其他已经 float 的 QDockWidgets(不是标签式的!)。
为了在拖放时获得漂亮的悬停效果, float 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) 重新养育 - 这就是我正在尝试的 atm
2) QDrag - 对我不起作用,async exec() 破坏了我的应用程序,最后我不得不重新设置父级
3) 调用新 QMainWindow 的 addDockWidget(...) - 停靠 QDockWidget,我将不得不让它再次 float 并以某种方式“继续拖动”
我愿意接受任何新建议 :) 在此先感谢您!
最佳答案
我现在正在努力解决同样的问题并想分享。
我发现这个论坛帖子处理同样的问题:http://www.qtcentre.org/threads/41847-Dragging-QDockWidgets-between-QMainWindows 然而,这个解决方案是有缺陷的:如果允许 Dockables float ,它就不能正常工作。当您进入另一个窗口并仍在拖动 QDockWidget 时,enterEvent 实际上不会触发。仅在发布后触发。
我也打算重新设置 (1)。当您还希望允许在窗口中重新排列 QDockWidget 时,QDrag 似乎有问题。
我认为可以通过对拖放 QDockWidget 的放下/释放使用react来正确地做到这一点。但是我找不到为此的事件或信号。
关于c++ - 在 QMainWindows 之间拖动 QDockWidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35287958/