QDrag 在拖动时被破坏

Posted

技术标签:

【中文标题】QDrag 在拖动时被破坏【英文标题】:QDrag destroyed while dragging 【发布时间】:2010-09-11 11:41:33 【问题描述】:

我有一个在 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::exec 的 Qt 4.3 文档doc.trolltech.com/4.3/qdrag.html > 在 Windows 上,Qt 事件循环 > 在操作期间被阻塞。所以在我看来,这不应该发生......对不起,我知道这可能没有多大帮助。 【参考方案1】:

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

【讨论】:

以上是关于QDrag 在拖动时被破坏的主要内容,如果未能解决你的问题,请参考以下文章

Rails会话在DELETE请求时被破坏[重复]

Qt:qthread在关闭期间线程仍在运行时被破坏

在 Extjs 中设置 basecls 会破坏可拖动容器

如何在PyQt5中使用QDrag拖动时显示QPushButton?

添加到 UITableViewController 时,SwiftUI 视图大小被破坏

动态插入 HTML DIV 会破坏页面上的 jQuery DatePicker