diff options
Diffstat (limited to 'tests/auto/widgets/widgets')
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 90 |
1 files changed, 66 insertions, 24 deletions
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 55345f2ae5..0dc4c07069 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -287,44 +287,86 @@ void tst_QMenu::addActionsAndClear() QCOMPARE(menus[0]->actions().count(), 0); } -static void testFunction() { } +static void testFunction0() {} +static void testFunction1(bool) {} + +template <typename T> +struct ImplicitlyConvertibleTo { + T t; + operator const T() const { return t; } + operator T() { return t; } +}; void tst_QMenu::addActionsConnect() { + // almost exhaustive check of addAction() overloads: + // (text), (icon, text), (icon, text, shortcut), (text, shortcut) + // each with a good sample of ways to QObject::connect() to + // QAction::triggered(bool) QMenu menu; - const QString text = QLatin1String("bla"); - const QIcon icon; - menu.addAction(text, &menu, SLOT(deleteLater())); - menu.addAction(text, &menu, &QMenu::deleteLater); - menu.addAction(text, testFunction); - menu.addAction(text, &menu, testFunction); - menu.addAction(icon, text, &menu, SLOT(deleteLater())); - menu.addAction(icon, text, &menu, &QMenu::deleteLater); - menu.addAction(icon, text, testFunction); - menu.addAction(icon, text, &menu, testFunction); + + // don't just pass QString etc - that'd be too easy (think QStringBuilder) + ImplicitlyConvertibleTo<QString> text = {QLatin1String("bla")}; + ImplicitlyConvertibleTo<QIcon> icon; + + const auto check = [&](auto &...args) { // don't need to perfectly-forward, only lvalues passed + menu.addAction(args...); + + menu.addAction(args..., &menu, SLOT(deleteLater())); + menu.addAction(args..., &menu, &QMenu::deleteLater); + menu.addAction(args..., testFunction0); + menu.addAction(args..., &menu, testFunction0); + menu.addAction(args..., testFunction1); + menu.addAction(args..., &menu, testFunction1); + menu.addAction(args..., [&](bool b) { menu.setEnabled(b); }); + menu.addAction(args..., &menu, [&](bool b) { menu.setEnabled(b); }); + + menu.addAction(args..., &menu, SLOT(deleteLater()), Qt::QueuedConnection); + menu.addAction(args..., &menu, &QMenu::deleteLater, Qt::QueuedConnection); + // doesn't exist: menu.addAction(args..., testFunction0, Qt::QueuedConnection); + menu.addAction(args..., &menu, testFunction0, Qt::QueuedConnection); + // doesn't exist: menu.addAction(args..., testFunction1, Qt::QueuedConnection); + menu.addAction(args..., &menu, testFunction1, Qt::QueuedConnection); + // doesn't exist: menu.addAction(args..., [&](bool b) { menu.setEnabled(b); }, Qt::QueuedConnection); + menu.addAction(args..., &menu, [&](bool b) { menu.setEnabled(b); }, Qt::QueuedConnection); + }; + const auto check1 = [&](auto &arg, auto &...args) { + check(arg, args...); + check(std::as_const(arg), args...); + }; + const auto check2 = [&](auto &arg1, auto &arg2, auto &...args) { + check1(arg1, arg2, args...); + check1(arg1, std::as_const(arg2), args...); + }; + [[maybe_unused]] + const auto check3 = [&](auto &arg1, auto &arg2, auto &arg3) { + check2(arg1, arg2, arg3); + check2(arg1, arg2, std::as_const(arg3)); + }; + + check1(text); + check2(icon, text); #ifndef QT_NO_SHORTCUT - const QKeySequence keySequence(Qt::CTRL | Qt::Key_C); + ImplicitlyConvertibleTo<QKeySequence> keySequence = {Qt::CTRL | Qt::Key_C}; + check2(text, keySequence); + check3(icon, text, keySequence); #if QT_DEPRECATED_SINCE(6, 4) QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED menu.addAction(text, &menu, SLOT(deleteLater()), keySequence); menu.addAction(text, &menu, &QMenu::deleteLater, keySequence); - menu.addAction(text, testFunction, keySequence); - menu.addAction(text, &menu, testFunction, keySequence); + menu.addAction(text, testFunction0, keySequence); + menu.addAction(text, &menu, testFunction0, keySequence); + menu.addAction(text, testFunction1, keySequence); + menu.addAction(text, &menu, testFunction1, keySequence); menu.addAction(icon, text, &menu, SLOT(deleteLater()), keySequence); menu.addAction(icon, text, &menu, &QMenu::deleteLater, keySequence); - menu.addAction(icon, text, testFunction, keySequence); - menu.addAction(icon, text, &menu, testFunction, keySequence); + menu.addAction(icon, text, testFunction0, keySequence); + menu.addAction(icon, text, &menu, testFunction0, keySequence); + menu.addAction(icon, text, testFunction1, keySequence); + menu.addAction(icon, text, &menu, testFunction1, keySequence); QT_WARNING_POP #endif - menu.addAction(text, keySequence, &menu, SLOT(deleteLater())); - menu.addAction(text, keySequence, &menu, &QMenu::deleteLater); - menu.addAction(text, keySequence, testFunction); - menu.addAction(text, keySequence, &menu, testFunction); - menu.addAction(icon, text, keySequence, &menu, SLOT(deleteLater())); - menu.addAction(icon, text, keySequence, &menu, &QMenu::deleteLater); - menu.addAction(icon, text, keySequence, testFunction); - menu.addAction(icon, text, keySequence, &menu, testFunction); #endif // !QT_NO_SHORTCUT } |