在Qt应用程序中获取命令行参数

mor*_*ous 10 c++ qt qt-creator

以下代码片段来自我使用Qt框架编写的一个小应用程序.这个想法是app可以以批处理模式运行(即由脚本调用),也可以以交互方式运行.

因此,重要的是,我能够解析命令行参数,以便知道运行哪种模式等.

[编辑]

我在Ubuntu Karmic上使用Qt Creator 1.3.1进行调试.参数以正常方式传递(即通过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;
}
Run Code Online (Sandbox Code Playgroud)

[更新]

我已经确定了问题 - 由于某种原因,虽然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;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我如何在我的应用程序中检索命令行args?

Hos*_*ork 17

如果你的argc和argv很好,我很惊讶这QApplication::arguments()是非常简单的.注意源代码.过滤#ifdefs for 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;
}
Run Code Online (Sandbox Code Playgroud)

这就是你所拥有的一切.有一个Unicode警告我不认为适用于Karmic:

"在Unix上,这个列表是根据传递给main()函数中构造函数的argc和argv参数构建的.argv中的字符串数据是使用QString :: fromLocal8Bit()解释的;因此无法传递,因为例如,在Latin1语言环境中运行的系统上的日语命令行参数.大多数现代Unix系统都没有这个限制,因为它们是基于Unicode的."

您可以直接针对argc和argv尝试该代码的副本,看看会发生什么.


小智 7

只是为了保持响应最新,Qt 现在提供了一个专门的类来解析命令行:

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

PS:只能将此作为回复,不能发表评论;我很抱歉,因为问题实际上不是如何解析,而是如何访问。