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

时间:2010-05-27 03:54:17

标签: 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;
}

[更新]

我已经确定了问题 - 由于某些原因,虽然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;
}

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

4 个答案:

答案 0 :(得分:16)

如果你的argc和argv很好,我很惊讶这是可能的,因为QApplication::arguments()非常简单。注意the source code。过滤#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;
}

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

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

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

答案 1 :(得分:2)

如果您正在编写仅限控制台的应用程序,那么您可能需要考虑使用QCoreApplication而不是QApplicition。 QCoreApplication是QtCore的一部分,而QApplication是在QtGui中定义的,因此您会获得额外且不必要的依赖。

答案 2 :(得分:2)

为了使响应保持最新,Qt现在提供了一个用于解析命令行的专用类:

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

P.S。 :只能将此作为回复而不是评论发布;对不起,因为问题不在于如何解析而是如何访问。

答案 3 :(得分:0)

这是一个在 QStringList 中包含参数的简单示例。假设您使用参数 -q -t

启动应用程序
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

QString x;

for (int i=1; i<argc; i++)
{
    x.append(argv[i]);
}
qDebug() << x;
QStringList args = x.split("-");
args.removeFirst();
qDebug() << "args="<< args;
return a.exec();
}

输出如下

x= "-q-t"

args= ("q", "t")

现在你有参数作为 QStringList ..

这是我在一个小应用程序中编写和使用的完整代码

#include "mainwindow.h"

#include <QApplication>
#include <QDebug>
static  QStringList arguments;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
//analyze the arguments
//-b: use buidin player and if it does not exist use mpg123 shell to play files
//
//-t: test the player upon startup and exit
//-s: use the following speaker ID for the test
//-f: use the following file name and path
//syntax: example:
//                  -b : to use build in player
//                  -t -s xx:xx:xx:xx:xx -f azanfile.mp3: to test upon startup playing a file


    bool useBuildInPlayer;

    QString x;
    for (int i=1; i<argc; i++)
    {
        x.append(argv[i]);
    }
    arguments << x.split("-");    arguments.removeFirst();
    qDebug() << arguments;

    if (arguments.indexOf("b")>=0) 
        useBuildInPlayer=true;
    else                            
        useBuildInPlayer=false;

    bool TestSpeaker = false;
    bool spkr=false; QString speaker;
    bool playfile=false;  QStringList testfiles;
    QString filestring;
    foreach (QString x, arguments)
    {
        if (x.left(1)=="s")
        {
            speaker = x.mid(1,-1); //remove the s from the beginning
            spkr=true;
        }
        if (x.left(1)=="f")
        {
            filestring=x.mid(1,-1);
            playfile=true;
            testfiles<<filestring;
        }
        if (x=="t")
            TestSpeaker = true;
    }

    if (TestSpeaker)
    {
        if (spkr)
        {
            qDebug() << "testing speaker "<< speaker;
        }
        else
        {
            qDebug() << "test argument needs speaker -s xx:xx:xx:xx:xx";
        }
        if (playfile)
        {
            qDebug() << "testing file "<< filestring;
        }
        else
        {
            qDebug() << "test file is missing";
        }
    }
    if (TestSpeaker && spkr && playfile)
    {

        if (useBuildInPlayer) //use build in player
        {
            qDebug() << "testing using buildin player";

        }
        else // use mpg123 shell
        {
            qDebug() << "testing using mpg123 shell";

        }
    }


    return a.exec();
}