2014-11-03 126 views
3

我的程序可以在没有GUI的服务器上运行,也可以在桌面上运行。 当它运行在可以显示GUI的系统上时,我想实例化QApplication,并且当它位于服务器上时,我想要QCoreApplication。确定系统是否可以实例化QApplication(GUI支持)

如果我实例化的QApplication的服务器上,它要么段错误(至少它曾经),或显示错误消息和退出,没有让我有机会来实例化QCoreApplication,而不是:

此应用程序失败开始是因为它找不到或加载Qt平台插件“xcb”。可用的平台插件是:linuxfb, 最小,屏幕外。重新安装该应用程序可能会解决此问题。

认真吗?

当我在服务器上运行我的程序时,我只传递一个-noGui参数。它工作正常,但我想检测系统是否可以使用QApplication,所以我可以摆脱这种说法。

我确定在某个地方已经有答案了,但我无法接受它。

+0

为什么不直接检查插件呢? – lpapp 2014-11-03 04:10:18

+0

插件可能因系统而异,这可能会导致误报。我与Qt合作“代码一次,无处不在”。我更喜欢Qt库中更清洁和标准的方式,但是,这可能是最后的解决方案。 – deck 2014-11-03 04:20:33

+0

不是,实际上,这可以在没有ifdefs的情况下进行编程。 – lpapp 2014-11-03 04:21:17

回答

2

为防万一有人想知道我是如何解决这个问题的,我拦截了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); 
} 
相关问题