当使用Qt 5.3或Qt 5.4编译电话时,QGuiApplication会停止事件循环(但不会使用Qt 5.2)

sas*_*alm 7 c++ qt android qt5.3 qt5.4

我创建了一个简单的程序来重现问题.当我锁定手机,或者如果我切换到我的Android手机中的另一个应用程序时,工作线程继续打印,但事件循环停止.当我切换回我的应用程序时,事件循环重新开始.

如果我用QCoreApplication替换QGuiApplication,问题就会消失.如果我用Qt 5.2而不是Qt 5.3编译,问题就会消失.Qt 5.4与Qt 5.3具有相同的问题.

static int count = 0;

void workerThread()
{
    while (1) {
        qDebug("Worker thread %d", count++);
        sleep(1);
    }
}

void MyObject::step()
{
    qDebug("Event loop %d", count++);
}

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);
    MyObject w;
    QTimer timer;
    QObject::connect(&timer, SIGNAL(timeout()), &w, SLOT(step()));
    timer.start(1000);
    QtConcurrent::run(workerThread);
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

当应用程序失去焦点时,如何阻止QGuiApplication停止事件循环?我需要我的应用程序来处理事件,即使不在前台.

lpa*_*app 4

正如我在评论中提到的,我为您创建了一个错误报告,冒着被拒绝的风险,但至少我们会得到官方维护人员的反馈。

当锁定手机或切换应用程序时,QGuiApplication“停止”。

现在它已被撤回,这很公平,因为正如维护者声称的那样,您应该专注于创建服务不是活动。然而,目前还没有专用的 Qt API。

在活动中这样做不是一个好主意的原因很简单,当应用程序进入“后台”时,它可能会被杀死,甚至立即被杀死。此外,它可能会比用户预期的更早耗尽电池。简而言之,这被维护者认为是一个错误,而不是 5.2 中的一个功能,似乎已经修复了。

从今天起,您可以在这里找到一些如何创建服务的帮助:

在android上使用Qt构建后台服务