(更新)QT QML 5.6 - 是什么原因导致此警告 "QApplication was not created in the main() thread"?
(UPDATE) QT QML 5.6 - What causes this warning "QApplication was not created in the main() thread"?
[更新] 好的,我正在更新我之前的问题。起初我以为当我从 .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 设备上编译应用程序。
----旧QUESTION\Start----
目前正在开发一个基于 Qt 5.6(C++ 和 QML)的 Android 应用程序。由于 UI 基于 QtQuick,我从 pro.file.
中删除了 'widgets'
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() 在另一个?一旦我将 'widgets' 放入 .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();
}
----旧QUESTION\End----
QApplication
依赖于 widgets
模块。请改用 QGuiApplication
。
发现错误。一个未使用的文件仍然包含在项目中(即使代码中没有 #include
ed)并且它有一个 QTranslator
的全局实例。从其他各种(类似的)线程可以清楚地看出,QApplication
应该是 main()
中第一个被初始化的 QObject
。这就是为什么 main()
不在父线程中的原因,因为 QTranslator
在 main()
.
执行之前被初始化了
这种愚蠢的错误占用了一整天的时间。和平!
[更新] 好的,我正在更新我之前的问题。起初我以为当我从 .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 设备上编译应用程序。
----旧QUESTION\Start----
目前正在开发一个基于 Qt 5.6(C++ 和 QML)的 Android 应用程序。由于 UI 基于 QtQuick,我从 pro.file.
中删除了 'widgets'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() 在另一个?一旦我将 'widgets' 放入 .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();
}
----旧QUESTION\End----
QApplication
依赖于 widgets
模块。请改用 QGuiApplication
。
发现错误。一个未使用的文件仍然包含在项目中(即使代码中没有 #include
ed)并且它有一个 QTranslator
的全局实例。从其他各种(类似的)线程可以清楚地看出,QApplication
应该是 main()
中第一个被初始化的 QObject
。这就是为什么 main()
不在父线程中的原因,因为 QTranslator
在 main()
.
这种愚蠢的错误占用了一整天的时间。和平!