Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt应用程序中检索命令行参数_C++_Qt - Fatal编程技术网

C++ 在Qt应用程序中检索命令行参数

C++ 在Qt应用程序中检索命令行参数,c++,qt,C++,Qt,我想从Unix命令提示符执行以下操作: ./countHats("red") or ./countHats "red" 然后程序运行并计算红帽子的数量 我该怎么做 int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); w.setGeometry(QRect(QPoint(100,100), QSize(1000,500)));

我想从Unix命令提示符执行以下操作:

./countHats("red")   or 
./countHats "red"
然后程序运行并计算红帽子的数量

我该怎么做

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.setGeometry(QRect(QPoint(100,100), QSize(1000,500)));

    CHat *hat = new CHat();
    hat->color(argv[0]);//"red"   ????

    return a.exec();
}

代码应为argv[1]

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.setGeometry(QRect(QPoint(100,100), QSize(1000,500)));

    CHat *hat = new CHat();
    hat->color(argv[1]);//"red"   ????  -->  argv[1]

    return a.exec();
}
这适用于命令行:

./countHats "red"   or 
./countHats red
你最好用

基本上,您需要这样使用它:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.setGeometry(QRect(QPoint(100,100), QSize(1000,500)));

    CHat *hat = new CHat();
    hat->color(QCoreApplication::arguments().at(1));

    return a.exec();
}
然后调用以下命令:
/countHats red
。在这种特殊情况下不需要引号,也不需要括号,尽管它也可以使用引号

如果你有一个包含空格的参数,你就需要引号,诸如此类,而对于非常简单的颜色来说,情况并非如此,而且,无论如何,你都需要颜色代码管理


PS,为什么我们要这么做,您应该为您的setter使用更好的名称,如
setColor
color()
通常用于获取颜色的值,而不是设置该值,但现在这有点离题了。我也只是想帮你指出这一点

此外,您似乎没有删除帽子,它也没有参与Qt父/子关系以自动删除。你也需要改进这一点


但是请注意,我和David Faure一直在开发一个
QCommandLineParser
类,希望您可以从Qt5.2开始使用该类。现在正在审查gerrit上的更改以进行集成。

首先,对于C/C++中的任何应用程序:argv的第一个元素是程序名,因此argv[0]将是“countHats”而不是“red”。如果您想要更多的命令行参数,我建议您使用boost::program_选项库,它非常容易使用,而且功能非常强大。

我不会称之为“不幸”。“invokeMethod”评论是一个完美的教科书解决方案。我可以想到用例,在那里它显然是优越的。但发展的一部分也是要知道,什么时候有些事情是过度的更好地使用
QApplication::arguments
我不认为仅仅为这个小功能引入额外的依赖关系有多大意义,尤其是当它是一个Qt应用程序时。可能会有冲突的问题,比如关键词等等。这需要进一步的解决办法。另外,argv[0]不一定总是countHats,只是通常。我完全同意,这就是为什么我说“如果您想有更多的命令行参数”不是在这种情况下,而是如果您想有命名选项(例如-c表示hats的颜色,-s表示大小等等)。当argv[0]不是程序名时,您能举个例子吗?我自己也是一个初学者,所以我很高兴能学到新东西:)。即使你们想要更多,你们也不会把boost和qt混在一起。仅就这一点而言,这有点不切实际。您可能会使用我在回复中已经提到的QCommandLineParser的克隆,或者直接从Qt5.2开始使用。至于argv[0]不同,请阅读以下内容: