diff options
7 files changed, 124 insertions, 2 deletions
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp index 67d5f41b38..6d6d7fe2ed 100644 --- a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp @@ -39,6 +39,7 @@ ****************************************************************************/ #include <QCommandLineOption> +#include <QCommandLineParser> int main() { @@ -48,4 +49,14 @@ QCommandLineOption verboseOption("verbose", "Verbose mode. Prints out more infor QCommandLineOption outputOption(QStringList() << "o" << "output", "Write generated data into <file>.", "file"); //! [0] +//! [cxx11-init] +QCommandLineParser parser; +parser.addOption({"verbose", "Verbose mode. Prints out more information."}); +//! [cxx11-init] + +//! [cxx11-init-list] +QCommandLineParser parser; +parser.addOption({{"o", "output"}, "Write generated data into <file>.", "file"}); +//! [cxx11-init-list] + } diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp index 257a138d0d..26bc43f194 100644 --- a/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp @@ -82,3 +82,20 @@ int main(int argc, char *argv[]) } //! [0] + +void f() { +//! [cxx11] + parser.addOptions({ + // A boolean option with a single name (-p) + {"p", + QCoreApplication::translate("main", "Show progress during copy")}, + // A boolean option with multiple names (-f, --force) + {{"f", "force"}, + QCoreApplication::translate("main", "Overwrite existing files.")}, + // An option with a value + {{"t", "target-directory"}, + QCoreApplication::translate("main", "Copy all source files into <directory>."), + QCoreApplication::translate("main", "directory")}, + }); +//! [cxx11] +} diff --git a/src/corelib/tools/qcommandlineoption.cpp b/src/corelib/tools/qcommandlineoption.cpp index ccf9211b52..02e922d323 100644 --- a/src/corelib/tools/qcommandlineoption.cpp +++ b/src/corelib/tools/qcommandlineoption.cpp @@ -96,6 +96,41 @@ public: */ /*! + Constructs a command line option object with the name \a name. + + The name can be either short or long. If the name is one character in + length, it is considered a short name. Option names must not be empty, + must not start with a dash or a slash character, must not contain a \c{=} + and cannot be repeated. + + \sa setDescription(), setValueName(), setDefaultValues() +*/ +QCommandLineOption::QCommandLineOption(const QString &name) + : d(new QCommandLineOptionPrivate) +{ + d->setNames(QStringList(name)); +} + +/*! + Constructs a command line option object with the names \a names. + + This overload allows to set multiple names for the option, for instance + \c{o} and \c{output}. + + The names can be either short or long. Any name in the list that is one + character in length is a short name. Option names must not be empty, + must not start with a dash or a slash character, must not contain a \c{=} + and cannot be repeated. + + \sa setDescription(), setValueName(), setDefaultValues() +*/ +QCommandLineOption::QCommandLineOption(const QStringList &names) + : d(new QCommandLineOptionPrivate) +{ + d->setNames(names); +} + +/*! Constructs a command line option object with the given arguments. The name of the option is set to \a name. @@ -110,6 +145,12 @@ public: In addition, the \a valueName can be set if the option expects a value. The default value for the option is set to \a defaultValue. + In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4 + and later, it no longer is and can be used for C++11-style uniform + initialization: + + \snippet code/src_corelib_tools_qcommandlineoption.cpp cxx11-init + \sa setDescription(), setValueName(), setDefaultValues() */ QCommandLineOption::QCommandLineOption(const QString &name, const QString &description, @@ -141,6 +182,12 @@ QCommandLineOption::QCommandLineOption(const QString &name, const QString &descr In addition, the \a valueName can be set if the option expects a value. The default value for the option is set to \a defaultValue. + In Qt versions before 5.4, this constructor was \c explicit. In Qt 5.4 + and later, it no longer is and can be used for C++11-style uniform + initialization: + + \snippet code/src_corelib_tools_qcommandlineoption.cpp cxx11-init-list + \sa setDescription(), setValueName(), setDefaultValues() */ QCommandLineOption::QCommandLineOption(const QStringList &names, const QString &description, diff --git a/src/corelib/tools/qcommandlineoption.h b/src/corelib/tools/qcommandlineoption.h index 49223cda37..0230586c29 100644 --- a/src/corelib/tools/qcommandlineoption.h +++ b/src/corelib/tools/qcommandlineoption.h @@ -52,10 +52,12 @@ class QCommandLineOptionPrivate; class Q_CORE_EXPORT QCommandLineOption { public: - explicit QCommandLineOption(const QString &name, const QString &description = QString(), + explicit QCommandLineOption(const QString &name); + explicit QCommandLineOption(const QStringList &names); + /*implicit*/ QCommandLineOption(const QString &name, const QString &description, const QString &valueName = QString(), const QString &defaultValue = QString()); - explicit QCommandLineOption(const QStringList &names, const QString &description = QString(), + /*implicit*/ QCommandLineOption(const QStringList &names, const QString &description, const QString &valueName = QString(), const QString &defaultValue = QString()); QCommandLineOption(const QCommandLineOption &other); diff --git a/src/corelib/tools/qcommandlineparser.cpp b/src/corelib/tools/qcommandlineparser.cpp index 168701d13c..f503ed7452 100644 --- a/src/corelib/tools/qcommandlineparser.cpp +++ b/src/corelib/tools/qcommandlineparser.cpp @@ -179,6 +179,10 @@ QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const Example: \snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0 + If your compiler supports the C++11 standard, the three addOption() calls in + the above example can be simplified: + \snippet code/src_corelib_tools_qcommandlineparser_main.cpp cxx11 + Known limitation: the parsing of Qt options inside QCoreApplication and subclasses happens before QCommandLineParser exists, so it can't take it into account. This means any option value that looks like a builtin Qt option, will be treated by @@ -342,6 +346,24 @@ bool QCommandLineParser::addOption(const QCommandLineOption &option) } /*! + \since 5.4 + + Adds the options \a options to look for while parsing. + + Returns \c false if adding any of the options failed; otherwise returns \c false. + + Cf. addOption() for when it may fail. +*/ +bool QCommandLineParser::addOptions(const QList<QCommandLineOption> &options) +{ + // should be optimized (but it's no worse than what was possible before) + bool result = true; + for (QList<QCommandLineOption>::const_iterator it = options.begin(), end = options.end(); it != end; ++it) + result &= addOption(*it); + return result; +} + +/*! Adds the \c{-v} / \c{--version} option, which displays the version string of the application. This option is handled automatically by QCommandLineParser. diff --git a/src/corelib/tools/qcommandlineparser.h b/src/corelib/tools/qcommandlineparser.h index 946d4dd238..ee606d6cf4 100644 --- a/src/corelib/tools/qcommandlineparser.h +++ b/src/corelib/tools/qcommandlineparser.h @@ -66,6 +66,7 @@ public: void setSingleDashWordOptionMode(SingleDashWordOptionMode parsingMode); bool addOption(const QCommandLineOption &commandLineOption); + bool addOptions(const QList<QCommandLineOption> &options); QCommandLineOption addVersionOption(); QCommandLineOption addHelpOption(); diff --git a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp index ce30710f7f..dcc93eaa86 100644 --- a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp +++ b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp @@ -77,6 +77,7 @@ private slots: void testStdinArgument(); void testSingleDashWordOptionModes_data(); void testSingleDashWordOptionModes(); + void testCpp11StyleInitialization(); // QProcess-based tests using qcommandlineparser_test_helper void testVersionOption(); @@ -450,6 +451,27 @@ void tst_QCommandLineParser::testSingleDashWordOptionModes() QCOMPARE(parser.unknownOptionNames(), QStringList()); } +void tst_QCommandLineParser::testCpp11StyleInitialization() +{ +#if defined(Q_COMPILER_INITIALIZER_LISTS) && defined(Q_COMPILER_UNIFORM_INIT) + QCoreApplication app(empty_argc, empty_argv); + + QCommandLineParser parser; + // primarily check that this compiles: + parser.addOptions({ + { "a", "The A option." }, + { { "v", "verbose" }, "The verbose option." }, + { { "i", "infile" }, "The input file.", "value" }, + }); + // but do a very basic functionality test, too: + QVERIFY(parser.parse({"tst_QCommandLineParser", "-a", "-vvv", "--infile=in.txt"})); + QCOMPARE(parser.optionNames(), (QStringList{"a", "v", "v", "v", "infile"})); + QCOMPARE(parser.value("infile"), QString("in.txt")); +#else + QSKIP("This test requires C++11 uniform initialization support in the compiler."); +#endif +} + void tst_QCommandLineParser::testVersionOption() { #ifdef QT_NO_PROCESS |