2010-05-27 4 views
9

Следующий фрагмент из небольшого приложения, которое я написал, используя фреймворк Qt. Идея заключается в том, что приложение может запускаться в пакетном режиме (т. Е. Вызывается скриптом) или может выполняться интерактивно.Получение аргументов командной строки в приложении Qt

Поэтому очень важно, что я могу разобрать аргументы командной строки для того, чтобы знать, какой режим, в котором для запуска и т.д.

[Редактировать]

я отладки с помощью Qt Creator 1.3 .1 на Ubuntu Karmic. Аргументы передаются обычным способом (т. Е. Путем добавления их через настройки «Project» в IDE Qt Creator).

Когда я запустил приложение, кажется, что аргументы не передаются приложению. Код ниже, это фрагмент моей функции 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; 
} 

[Update]

Я определил проблему - по какой-то причине, хотя 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

У вас есть дополнительная скобка на вашей попытке/уловить там. Вы не даете нам код для утилиты :: option_values ​​...Не могли бы вы упростить этот пример, если вы скажете, если cmdline_args.isEmpty() напечатать «oh no!»? Если да, у вас все еще проблема? – HostileFork

+0

Кстати, что такое утилита :: options_values? Я не вижу ничего подобного в документации Qt. Также, даже если вы не передаете аргументы, первым аргументом всегда будет имя программы. Поэтому я думаю, что проблема может быть в утилите :: option_values. Также вы попробовали проверить argv [0], argv [1] и т. Д. ... попробуйте это тоже. – liaK

ответ

16

Если ваш арк и argv хороши, я удивлен, что это будет возможно, так как QApplication::arguments() чрезвычайно прост. Примечание the source code. Фильтрация #ifdefs для Linux, это просто:

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; 
} 

Это все, что у вас есть. Существует одно предупреждение Unicode, которое я бы не подумал применить к Karmic:

«В Unix этот список построен из параметров argc и argv, переданных конструктору в функции main(). Строковые данные в argv интерпретируется с помощью QString :: fromLocal8Bit(), поэтому невозможно передать, например, японские аргументы командной строки в системе, которая работает в локали Latin1. Большинство современных Unix-систем не имеют этого ограничения, поскольку они являются Unicode- исходя из."

Вы можете попробовать копию этого кода против вашего argc и argv напрямую и посмотреть, что произойдет.

+1

+1 для указания меня в правильном направлении. Я был введен в заблуждение от того, что argc был правильной величиной, и не потрудился разыгрывать argv, чтобы проверить его содержимое. Я помещал небольшое заявление, чтобы печатать аргументы в stdout, и я был в ужасе, увидев, что элементы argv - это пустые строки - какое это безумие?! – morpheous

+1

Я буду принимать это как правильный ответ, так как он начал меня на правильном пути - также я не могу удалить исходный вопрос, так как я проголосовал за этот ответ. Исходный код был неправильным в том, что я должен вызывать аргументы для экземпляра приложения (а не класса) - я не знаю, почему я этого раньше не заметил (и никто не сделал этого). Также в аргументах документации есть статический метод (и он компилируется правильно [причудливо] при вызове staticall), на самом деле я должен вызывать его как метод экземпляра (go figure!). – morpheous

+1

@morpheous: нет необходимости вызывать аргументы() в экземпляре QCoreApplication, поскольку это статическая функция. Однако я считаю qApp-> argumentemtns() более приятным, чем QCoreApplication :: arguments(). – CMircea

2

Если вы пишете только приложение «Консоль», вы можете захотеть использовать QCoreApplication вместо QApplicition. QCoreApplication является частью QtCore, а QApplication - в QtGui, поэтому вы получаете дополнительную и ненужную зависимость.

2

только для того, чтобы держать ответ на последнюю дату, Qt теперь предоставляет специальный класс для разбора командной строки:

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

P.S. : может публиковать это только как ответ, а не комментарий; Извините, потому что на самом деле вопрос не в том, как разбираться, но как получить доступ.

Смежные вопросы