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

时间:2016-09-14 13:16:08

标签: android c++ qt qapplication

[更新]好的,我正在更新我之前的问题。起初我认为当我从.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设备上编译应用程序。

---- OLD QUESTION \ Start ----

目前正在开发基于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文件中放入'小部件',两个错误就不会再出现了。我真的没有得到两件事之间的相关性。 P.S。在程序的这个阶段并不真正相关,但我也没有在我的应用程序中创建任何新线程。 这就是我的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();
}    

---- OLD QUESTION \ End ----

2 个答案:

答案 0 :(得分:0)

QApplication取决于widgets模块。请改用QGuiApplication

答案 1 :(得分:0)

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

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