2014-11-03 1 views
3

내 프로그램은 GUI가없는 서버 또는 데스크탑에서 실행할 수 있습니다. GUI를 표시 할 수있는 시스템에서 실행될 때 QApplication을 인스턴스화하고 서버에있을 때 QCoreApplication이 필요합니다.시스템이 QApplication (GUI 지원)을 인스턴스화 할 수 있는지 확인

이 응용 프로그램이 실패 : 나는 서버에서의 QApplication을 실체화 경우

는, 그 중 하나는 segfault 대신 QCoreApplication를 인스턴스화 나에게 기회를 말도없이 (적어도 그것은에 사용) 또는 오류 메시지와 출구를 표시 Qt 플랫폼 플러그인 "xcb"을 (를) 찾거나로드 할 수 없어 시작할 수 없습니다. 사용 가능한 플랫폼 플러그인은 다음과 같습니다 : linuxfb, 최소, 오프 스크린. 응용 프로그램을 다시 설치하면이 문제가 해결 될 수 있습니다.

심각하게?

현재 서버에서 프로그램을 실행할 때 -noGui 인수 만 전달합니다. 잘 작동하지만 시스템에서 QApplication을 사용할 수 있는지 여부를 감지하여이 인수를 제거 할 수 있습니다.

나는 이미 그 어딘가에 대한 답이있을 것이라고 확신하지만, 그것에 손을 대볼 수는 없다.

+0

왜 플러그인을 확인하지 않습니까? – lpapp

+0

플러그인은 시스템에 따라 다를 수 있으며 오 탐지 (false positive)를 유발할 수 있습니다. Qt를 사용하여 "코드는 한 번 작동하고 모든 곳에서 작동합니다"라고합니다. Qt 라이브러리에서 더 깨끗하고 표준적인 방법을 선호 하겠지만 그렇다고 최후의 해결책이 될 수 있습니다. – deck

+0

실제로, 아니요, 사실 ifdef없이 프로그래밍 할 수 있습니다. – lpapp

답변

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); 
} 
관련 문제