2010-05-27 5 views
9

다음 스 니펫은 Qt 프레임 워크를 사용하여 작성한 작은 애플리케이션에서 가져온 것입니다. 아이디어는 앱이 배치 모드 (즉, 스크립트에 의해 호출 됨)에서 실행되거나 대화식으로 실행될 수 있다는 것입니다.Qt 애플리케이션에서 명령 행 인수 얻기

내가 실행하는 어떤 모드를 알기 위해 명령 줄 인수를 구문 분석 할 수 오전, 중요하다 등

[편집]

내가 Qt는 창조주 1.3을 사용하여 디버깅하고 .1 Ubuntu Karmic에서. 인수는 정상적인 방법으로 전달됩니다 (즉, Qt Creator IDE의 'Project'설정을 통해 인수를 추가 함).

응용 프로그램을 실행할 때 인수가 응용 프로그램에 전달되지 않는 것으로 보입니다. 아래 코드는 내 main() 함수의 스 니펫입니다.

int main(int argc, char *argv[]) 
{ 
    //Q_INIT_RESOURCE(application); 

    try { 
     QApplication the_app(argc, argv); 

     //trying to get the arguments into a list  
     QStringList cmdline_args = QCoreApplication::arguments(); 

     // Code continues ... 
    } 
    catch (const MyCustomException &e) { return 1; } 

    return 0; 
} 

[업데이트] 내가 문제를 식별 한

-는 argc가 정확하지만, 어떤 이유로, ARGV의 요소가 빈 문자열이됩니다.

이 작은 코드 스 니펫을 argv 항목을 인쇄하기 위해 넣었습니다. 모든 항목이 비어 있다는 것을 두려워했습니다.

for (int i=0; i< argc; i++){ 
    std::string s(argv[i]); //required so I can see the damn variable in the debugger 
    std::cout << s << std::endl; 
} 

누구든지 내 응용 프로그램에서 명령 줄 인수를 검색하는 방법을 알고 있습니까?

+0

당신은 당신의 try/catch에 여분의 중괄호가 있습니다. 당신은 우리에게 utility :: option_values에 대한 코드를 제공하지 않습니다 ...cmdline_args.isEmpty() print "oh no!"라고 말하면이 예제를 단순화 할 수 없습니까? 그래도 문제가 계속 발생합니까? – HostileFork

+0

그런데 utility :: options_values는 무엇입니까? 나는 Qt 문서에서도 그런 것을 보지 못했다. 또한 인수를 전달하지 않더라도 첫 번째 인수는 항상 프로그램 이름이됩니다. 그래서 문제가 유틸리티 :: option_values ​​수 있습니다 생각합니다. 또한 argv [0], argv [1] 등을 검사 해 보았습니다 ... 그 중 하나를 시도하십시오 .. – liaK

답변

16

argc와 argv가 좋은 경우 QApplication::arguments()은 매우 간단하므로이 방법이 유용 할 수 있습니다. 참고 the source code. Linux 용 #ifdefs 필터링은 다음과 같습니다.

QStringList QCoreApplication::arguments() 
{ 
    QStringList list; 
    if (!self) { 
     qWarning("QCoreApplication::arguments: Please instantiate the QApplication object first"); 
     return list; 
    } 
    const int ac = self->d_func()->argc; 
    char ** const av = self->d_func()->argv; 
    for (int a = 0; a < ac; ++a) { 
     list << QString::fromLocal8Bit(av[a]); 
    } 
    return list; 
} 

그게 전부입니다.

"Unix에서이 목록은 main() 함수의 생성자에 전달 된 argc 및 argv 매개 변수를 기반으로 작성되었습니다. argv의 문자열 데이터 QString :: fromLocal8Bit()을 사용하여 해석되므로 Latin1 로켈에서 실행되는 시스템에서 일본어 명령 줄 인수를 전달할 수 없습니다. 대부분의 최신 유닉스 시스템은 유니 코드 기반이므로이 제한이 없습니다. 기반. "

argc 및 argv에 대해 해당 코드의 복사본을 직접 시도해보고 어떤 일이 발생하는지 볼 수 있습니다.

+1

+1 올바른 방향으로 나를 가리키고 있습니다. 나는 argc가 올바른 값이라는 오해를 샀고 argv를 참조하여 내용을 검사하지 않았다. 인수를 stdout에 출력하기 위해 약간의 진술을했고, argv의 요소가 빈 문자열이라는 것을보고 놀라움을 금치 못했습니다. 어떤 종류의 광기입니까? – morpheous

+1

올바른 답으로 시작한 이래로 정답으로 받아 들일 것입니다. 또한이 답변을 투표 한 이후 원래 질문을 삭제할 수 없습니다. 원래 코드는 (클래스가 아닌) 어플리케이션의 인스턴스에서 인자를 호출해야한다는 점에서 잘못되었습니다. 왜 내가 더 일찍 이것을 발견하지 못했는지 (그리고 아무도하지 않았 음) 모르겠다. 또한 문서 인수에 정적 메서드 (그리고 정적으로 호출 될 때 [bizarrely] 올바르게 컴파일됩니다.), 실제로 인스턴스 메서드로 호출해야합니다 (그림 참조). – morpheous

+1

@morpheous : QCoreApplication 인스턴스는 정적 함수이므로 arguments()를 호출 할 필요가 없습니다. 그러나 qApp-> arguemtns() QCoreApplication :: arguments()보다 좋을 찾으십시오. – CMircea

2

콘솔 전용 응용 프로그램을 작성하는 경우 QApplicition 대신 QCoreApplication을 사용하는 것이 좋습니다. QCoreApplication은 QtCui의 일부이며 QApplication은 QtGui에 정의되어 있으므로 불필요한 종속성이 생깁니다.

http://doc.qt.io/qt-5/qcommandlineparser.html

추신 :

2

만 - - 날짜 반응을 유지하기 위해, Qt는 이제 명령 줄을 구문 분석을위한 전용 클래스를 제공 : 답글로만 답변을 게시 할 수 있습니다. 질문은 실제로 구문 분석하는 것이 아니라 액세스하는 방법 이었기 때문에 미안합니다.