以下代码片段来自我使用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;
}
有谁知道如何在我的应用程序中检索命令行参数?
答案 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();
}