(ОБНОВЛЕНИЕ) QT QML 5.6. Что вызывает это предупреждение. QApplication не был создан в потоке main()?

[ОБНОВЛЕНИЕ] Хорошо, я обновляю свой предыдущий вопрос. Сначала я подумал, что предупреждение появляется, когда я удаляю widgets из файла .pro, что было бы странным поведением. После копания я получил совершенно пустое приложение, и проблема все еще сохраняется. Мое приложение выглядит так:

#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-устройстве, используя набор Android for x86 (GCC 4.9, Qt 5.6.0).

---- СТАРЫЙ ВОПРОС\Начать ----

В настоящее время разрабатывается приложение для Android на основе Qt 5.6 (C++ и QML). Поскольку пользовательский интерфейс основан на QtQuick, я удалил «виджеты» из файла pro.file.

QT += core qml quick widgets network svg xml gui    

это приводит к предупреждению:

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

а также... как только я создаю экземпляр QQmlEngine в main() (конечно, после создания 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();
}    

---- СТАРЫЙ ВОПРОС\Конец ----


person spikeyeddy    schedule 14.09.2016    source источник


Ответы (2)


QApplication зависит от модуля widgets. Вместо этого используйте QGuiApplication.

person Velkan    schedule 14.09.2016
comment
Я обновил вопрос. Проблема была не в модуле widgets в файле .pro. Проблема сохраняется, даже если приложение полностью пустое. Проверьте отредактированный вопрос. Почему QApplication не создается в потоке main(), хотя больше ничего нет? - person spikeyeddy; 15.09.2016

нашел ошибку. Неиспользуемый файл по-прежнему был включен в проект (хотя и не #includeed в коде), и у него был глобальный экземпляр QTranslator. Как видно из различных других (похожих) потоков, QApplication должен быть первым QObject, который будет инициализирован в main(). Вот почему main() не было в родительском потоке, потому что QTranslator был инициализирован до выполнения main().

Такая глупая ошибка заняла целый день. Мир!

person spikeyeddy    schedule 15.09.2016