2014-11-03 86 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); 
}