在 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的主要内容,如果未能解决你的问题,请参考以下文章

子类化QMainWindows

子类化QMainWindows,添加菜单栏及工具栏,并添加图标

QT 主窗口 添加滚动条

QT 主窗口 添加滚动条

为啥我不能在程序的两个实例之间拖动一个点?

在两个 UiViewControllers 和 UIViews 之间实现拖动和滑动转换? [关闭]