c++ - 在 QMainWindows 之间拖动 QDockWidgets

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

我有一个关于在 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/

相关文章:

Android 拖放 ACTION_DRAG_ENDED 未触发

c++ - (bool | bool) 安全吗?

c++ - 在这个例子中,为什么 Range-v3 比 STL 慢?

javascript - 一个类的多个事件监听器

qt - 在QT中将字节数组保存为.png/.jpg文件

c++ - Q_ENUMS 与 BOOST_SCOPED_ENUM

Android GridView 通过拖放重新排序元素

c++ - 使用 gumbo-query 的 VC++ 问题(链接错误)

c++ - 如何在使用 C++11 线程模型或 tbb 线程类时取消特定线程?

javascript - 调用非父对象的函数