Получение аргументов командной строки в приложении Qt - PullRequest
10 голосов
/ 27 мая 2010

Следующий фрагмент взят из небольшого приложения, которое я написал с использованием фреймворка 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;
}

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

Ответы [ 3 ]

16 голосов
/ 27 мая 2010

Если ваши argc и argv хороши, я удивлен, что это возможно, так как QApplication::arguments() чрезвычайно прост. Примечание исходный код . Фильтрация #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;
}

Это все, что у тебя есть. Есть предостережение в Юникоде, которое, я думаю, не относится к Karmic:

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

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

2 голосов
/ 17 января 2017

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

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

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

2 голосов
/ 16 июля 2010

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

...