(更新)QT QML 5.6 - 是啥导致此警告“QApplication 未在 main() 线程中创建”?

Posted

技术标签:

【中文标题】(更新)QT QML 5.6 - 是啥导致此警告“QApplication 未在 main() 线程中创建”?【英文标题】:(UPDATE) QT QML 5.6 - What causes this warning "QApplication was not created in the main() thread"?(更新)QT QML 5.6 - 是什么导致此警告“QApplication 未在 main() 线程中创建”? 【发布时间】:2016-09-14 13:16:07 【问题描述】:

[更新] 好的,我正在更新我之前的问题。起初,我认为当我从 .pro 文件中删除 widgets 时会弹出警告——这将是一种特殊的行为。深入挖掘后,我最终得到了一个完全空的应用程序,问题仍然存在。我的应用程序如下所示:

#include <QApplication>

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    return app.exec();
    

根据其他类似问题的帖子,我了解到QApplication需要首先被初始化。在这种情况下,应用程序中没有其他内容。这个警告怎么还会出现?

W/ (16992): (null):0 ((null)): WARNING: QApplication was not created in the main() thread.

我正在使用 android for x86 (GCC 4.9, Qt 5.6.0) 工具包直接在我的 Android 设备上编译应用程序。

---- 旧问题\开始----

目前正在开发基于 Qt 5.6(C++ 和 QML)的 Android 应用。由于 UI 基于 QtQuick,我从 pro.file 中删除了“小部件”。

QT += core qml quick widgets network svg xml gui    

这会导致警告:

WARNING: QApplication was not created in the main() thread.    

而且...一旦我在 main() 中实例化 QQmlEngine(当然是在创建 QApplication 之后),也会显示此警告:

 QObject: Cannot create children for a parent that is in a different thread.
(Parent is QQmlDebuggerServiceFactory(0x65fffcd0), parent's thread is QThread(0x5d449f10), current thread is QThread(0x65183000)    

显然,应用程序在另一个线程中启动?和 main() 在另一个?一旦我将“小部件”放入 .pro 文件中,两个错误都不再出现。我真的不明白这两件事之间的相关性。 附注在程序的这个阶段并不真正相关,但我也没有在我的应用程序中创建任何新线程。 这就是我的 main() 的样子:

int main(int argc, char *argv[])

   QApplication app(argc, argv);

   qmlRegisterUncreatableType<MainFrame>("PSGApp", 1, 0, "MainFrame", "");

   MainFrame m_MainFrame;
   QQmlEngine engine;

   engine.rootContext()->setContextProperty("q_MainFrame",             &m_MainFrame);
   engine.rootContext()->setContextProperty("Ctr",                     m_MainFrame.c());
   engine.rootContext()->setContextProperty("Dev",                     m_MainFrame.c()->dev());
   engine.rootContext()->setContextProperty("Def",                     m_MainFrame.c()->dev()->_def());
   engine.rootContext()->setContextProperty("ModelUdpDevices",         m_MainFrame.UdpDevices());
   engine.rootContext()->setContextProperty("ModelDashboardDevices",   m_MainFrame.DashboardDevices());
   engine.rootContext()->setContextProperty("ModelZones",              m_MainFrame.c()->dev()->_DevZones());
   engine.rootContext()->setContextProperty("ModelRGParameter",        m_MainFrame.c()->dev()->RegelParameter());
   engine.rootContext()->setContextProperty("ModelSYSParameter",       m_MainFrame.c()->dev()->SysParameter());
   engine.rootContext()->setContextProperty("ModelKOMMParameter",      m_MainFrame.c()->dev()->KommParameter());

   QObject::connect(&app, SIGNAL(applicationStateChanged(Qt::ApplicationState)), &m_MainFrame, SLOT(applicationStateChanged(Qt::ApplicationState)));
   QObject::connect(&engine, SIGNAL(quit()), &app, SLOT(quit()));

   QQmlComponent component(&engine,QUrl(QStringLiteral("qrc:/qml/main.qml")));
   component.create();

   return app.exec();
    

----老问题\结束----

【问题讨论】:

【参考方案1】:

QApplication 依赖于 widgets 模块。请改用QGuiApplication

【讨论】:

我已经更新了这个问题。问题不在于 .pro 文件中的 widgets 模块。即使应用程序完全为空,问题仍然存在。检查编辑的问题。为什么 QApplication 没有在 main() 线程中创建,即使没有其他内容?【参考方案2】:

发现错误。项目中仍然包含一个未使用的文件(即使代码中没有#includeed),它有一个QTranslator 的全局实例。从各种其他(类似)线程中可以清楚地看出,QApplication 应该是第一个在main() 中初始化的QObject。这就是为什么main() 不在父线程中的原因,因为QTranslatormain() 执行之前被初始化。

这样一个愚蠢的错误占用了一整天。和平!

【讨论】:

以上是关于(更新)QT QML 5.6 - 是啥导致此警告“QApplication 未在 main() 线程中创建”?的主要内容,如果未能解决你的问题,请参考以下文章

Qt/QML:std::vector<int> 处理

为 iOS 编译 Qt 应用程序时使用 qml.qrc 发出警告

创建单个 ui.qml 文件的标准(Qt)方法是啥?

QT 不更新 UI

如何正确使用 Qt QML Image Provider

QT / QML如何在地图上运行mapReady?