summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineoption.cpp11
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qcommandlineparser_main.cpp17
-rw-r--r--src/corelib/tools/qcommandlineoption.cpp47
-rw-r--r--src/corelib/tools/qcommandlineoption.h6
-rw-r--r--src/corelib/tools/qcommandlineparser.cpp22
-rw-r--r--src/corelib/tools/qcommandlineparser.h1
-rw-r--r--tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.cpp22
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