【问题标题】:Is there a way to use QCommandLineParser with an option followed by multiple values?有没有办法将 QCommandLineParser 与一个选项后跟多个值一起使用?
【发布时间】:2021-05-02 20:14:38
【问题描述】:

我需要让我的应用程序扫描一些作为命令行参数给出的端口,到目前为止我有这个:

    QCommandLineOption portScanOption(QStringList() << "p" << "target-port",
                QCoreApplication::translate("main", "Scan <port> for other instances"),
                QCoreApplication::translate("main", "port"));
    parser.addOption(portScanOption);
    parser.process(app);
    auto ports = parser.values(portScanOption); // do something with the ports

为了使其正常工作,我需要传递如下参数:-p 5000 -p 7000 -p 8000。 我正在寻找一种方法来使其适用于以下输入:-p 5000 7000 8000,但我无法找到任何东西,甚至在官方文档中也没有。这是一件非常微不足道的事情,所以我希望 Qt 有这样的东西。你们知道应该怎么做吗?

【问题讨论】:

  • 我认为positional arguments 会导致您想要实现的目标。但是找不到好的例子:(
  • 我也研究了位置参数,但它们带来了一些问题。如果需要,我希望该应用程序也可以使用多个选项或不使用任何选项。

标签: c++ qt command-line-arguments


【解决方案1】:

这已经被处理了——你建议的语法不太适合QCommandLineParser。使用-p 5000,7000,8000-p "5000 7000 8000"。所有这些端口都是 port 选项的值,然后您可以用split(QRegularExpression("[, ]"), Qt::SkipEmptyParts)(即QString::split)将它们分开。例如:

auto ports = parser.value("target-port")
             .split(QRegularExpression("[, ]"), Qt::SkipEmptyParts);
for (auto &portStr : ports) {
  bool ok = false;
  int port = portStr.toInt(&ok);
  if (!ok) continue;
  // use port value here
}

另外,由于 Qt 源代码可用,您可以将命令行解析器源复制到您的项目中,重命名类,并扩展它以支持您想到的原始语法。

【讨论】:

  • 我承认我根本没有想到这一点,但是在值之间添加分隔符然后拆分字符串应该可以解决问题。目前调整 Qt 代码超出了我的范围,所以我将采用您的第一个解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2018-03-15
  • 2016-11-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多