c++ - QDrag 在拖动时被破坏

标签 c++ qt com drag-and-drop

我有一个在 QTreeView 中使用拖放操作的 Windows/Linux Qt 4.3 应用程序。我有两个非常相似的应用程序,它们使用同一组 Qt 库。拖放在 Linux 上适用于两者,但在 Windows 上仅适用于一个。

在不起作用的应用程序中,一旦移动鼠标,QDrag 对象就会被删除。它由事件队列中的 DeferredDelete 事件删除,事件队列在拖动期间仍在 Qt 中处理。我不知道如何查看导致 QDrag 对象过早删除的原因。

我想不出调试这个问题的好方法。我比较了来源,找不到任何明显的东西。我曾尝试在另一个应用程序中使用其中一个应用程序的代码。

有什么建议吗?

更新:

QDrag操作失败的原因是COM没有初始化成功,所以QDrag::exec中对DoDragDrop的调用立即返回。 QApplication 尝试通过在 qt_init 中调用 OleInitialize 来初始化 COM,但失败并出现错误“设置后无法更改线程模式”。

有趣的是,即使 OleInitialize 是在 main 中完成的第一件事,也会发生这种情况,因此线程模式最初是由某些外部依赖项设置的。在 Windows 上运行的应用程序之间的区别之一是失败的应用程序还包含 .NET 代码,所以这可能就是问题所在。

已解决:

此问题是 COM/CLR 互操作问题。 CLR 在初始化时将单元状态设置为 MTA,然后在 Qt 尝试初始化 COM 时失败。 Adam Nathan 讨论了这个问题和一个旧的解决方案在 Gotcha with STAThreadAttribute and Managed C++ .在 Visual Studio 2005 中,您可以在Configuration Properties > Linker > Advanced 中设置/CLRTHREADATTRIBUTE:STA 编译器选项,以将线程属性设置为 STA,而无需创建新的入口点。

最佳答案

我不知道是什么导致了这个,但我会尝试通过子类化 QDrag 来找出答案,覆盖 deleteLater()(好吧,重新实现它,但因为它是一个插槽,它无论如何都会被调用),使用它而不是一个 QDrag 并在 deleteLater() 中放置一个断点。

关于c++ - QDrag 在拖动时被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/106056/

相关文章:

python - 删除水平下划线

c++ - 需要有关跳过列表的信息

c++ - 如何获取 QDockWidget 在其当前停靠区域中的位置

com - VB6 错误 - 无法加载 .ocx 文件

winapi - COM 是 WTL 的必要条件吗?

c++ - 为什么 b.isEm() 在不同的行打印不同的东西?

c++ - 在模板中使用 typedef 和 typename

c++ - Qt5 -static x64 和链接噩梦

c++ - 如何处理 C++ 中的命名空间?

delphi - 如何从我的 Delphi 应用程序调用 IDM(Internet 下载管理器)