使用qtwinmigrate删除QtQuick模型

使用qtwinmigrate删除QtQuick模型,qt,qt-quick,Qt,Qt Quick,我正在使用qtwinmigrate和Qt 5.12.5在Win32应用程序中显示Qt快速控件 更具体地说,我有一个指向dll的C接口,在这里我托管了一个QQmlEngine实例,该实例通过QQuickWidget呈现内容,我在QWinWidget(QWinMigrate框架的一部分)的帮助下在客户端应用程序中显示了QQuickWidget 如果我不删除模型对象,那么每次隐藏并显示小部件时都会出现内存泄漏,即使我不重新创建模型对象,而是重用池中的旧对象。我怀疑旧的QML对象正在泄漏 由于delet

我正在使用qtwinmigrate和Qt 5.12.5在Win32应用程序中显示Qt快速控件

更具体地说,我有一个指向dll的C接口,在这里我托管了一个QQmlEngine实例,该实例通过QQuickWidget呈现内容,我在QWinWidget(QWinMigrate框架的一部分)的帮助下在客户端应用程序中显示了QQuickWidget

如果我不删除模型对象,那么每次隐藏并显示小部件时都会出现内存泄漏,即使我不重新创建模型对象,而是重用池中的旧对象。我怀疑旧的QML对象正在泄漏

由于deleteLater()无法工作,因为缺少执行QApplication事件循环的主Qt线程,所以我用谷歌搜索了删除模型对象的下一种方法:

QApplication::postEvent(m_Model, new QDeferredDeleteEvent());
Application::sendPostedEvents(0, QEvent::DeferredDelete);
它似乎运行良好,一切正常,没有内存泄漏。不幸的是,我最近发现,有时它会导致调用_ufastfail并显示下一条消息:

对象的一个QML信号处理程序正在进行时被销毁。 对象很可能是同步删除的(使用 QObject::deleteLater()),或者应用程序正在运行 嵌套事件循环。不支持此行为

在删除之前对这些对象调用disconnect()没有帮助

尝试在dll中创建QThread,将QApplication实例移动到此线程,并通过对其调用exec()运行其事件循环,然后对模型对象调用deleteLater()通常也会失败。在这种情况下,未删除模型对象。不过我可能做错了什么

你有什么建议我该怎么处理这个问题

谢谢

UPD: 我已经尝试再次重新实现“in-dll-QThread”方法,因为我第一次肯定是错的。现在,所有内容都已创建并存在于该线程中,但我无法显示控件:

  • 我看到Qt的下一个警告:
  • 警告:未在main()线程中创建QApplication

  • QWinWidget的构造函数在下次调用时挂起

    SetWindowLong((HWND)winId(),GWL_样式,WS_CHILD | WS_clipcchildren | WS_CLIPSIBLINGS)

  • 由于我使用Qt::BlockingQueuedConnection与主线程进行同步,所以它也挂起