确定系统是否可以实例化QApplication(GUI支持)

Determine if the system can instantiate QApplication (GUI support)

本文关键字:QApplication GUI 支持 实例化 系统 是否      更新时间:2023-10-16

我的程序可以在没有GUI的服务器上运行,也可以在桌面上运行。当它在一个可以显示GUI的系统上运行时,我想实例化QApplication,当它在服务器上时,我想要QCoreApplication。

如果我在服务器上实例化QApplication,它要么Segfault(至少以前是这样),要么显示错误消息并退出,而不让我有机会实例化QCoreApplication:

此应用程序无法启动,因为它找不到或加载Qt平台插件"xcb"。可用的平台插件有:linuxfb,最小,屏幕外。重新安装应用程序可以解决此问题。

说真的吗?

目前,当我在服务器上运行程序时,我只传递-noGui参数。它工作得很好,但我想检测系统是否可以使用QApplication,这样我就可以摆脱这个争论。

我确信在某个地方已经有了答案,但我无法掌握。

为了防止有人想知道我是如何解决这个问题的,我截取了QApplication发送的SIGABRT信号,并实例化了QCoreApplication。它工作得出奇地好,而且是跨平台的。

#include <QApplication>
#include <csetjmp>
#include <csignal>
#include <cstdlib>
jmp_buf env;
void onSigabrt(int)
{
    longjmp (env, 1);
}
QCoreApplication *loadQt(bool gui)
{
    QCoreApplication *application = NULL;
    if (gui)
    {
        if (setjmp(env) == 0)
        {
            signal(SIGABRT, &onSigabrt);
            application = new QApplication();
        }
        signal(SIGABRT, SIG_DFL);
    }
    if (!application)
        application = new QCoreApplication();
    return (application);
}