diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-07-10 11:59:47 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-07-10 11:24:14 +0000 |
commit | 014466f46abad9868e4e8d09c5d9ac6164ccf2f5 (patch) | |
tree | 5f1d87568d271c3b9865ee71a2b6c07e1e7a948c | |
parent | 83541427f555b73bcc0f8687adb6e81acf32c9ef (diff) |
QQuickMenu: add actionAt() and menuAt() accessors
This complements the add/insert/remove/take API that was added for
actions and menus. Unlike for menu items, there was no convenient
way to access a specific action or menu directly without accessing
the respective item first.
[ChangeLog][Controls][Menu] Added actionAt() and menuAt() accessors.
Change-Id: I5515441626b3a04b05265d5b42afdaea8e256709
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 34 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenu_p.h | 2 | ||||
-rw-r--r-- | tests/auto/menu/tst_menu.cpp | 23 |
3 files changed, 55 insertions, 4 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index 6fce1969..4794e36b 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -723,6 +723,23 @@ QQuickItem *QQuickMenu::takeItem(int index) /*! \since QtQuick.Controls 2.3 (Qt 5.10) + \qmlmethod Menu QtQuick.Controls::Menu::menuAt(int index) + + Returns the sub-menu at \a index, or \c null if the index is not valid or + there is no sub-menu at the specified index. +*/ +QQuickMenu *QQuickMenu::menuAt(int index) const +{ + Q_D(const QQuickMenu); + QQuickMenuItem *item = qobject_cast<QQuickMenuItem *>(d->itemAt(index)); + if (!item) + return nullptr; + + return item->subMenu(); +} + +/*! + \since QtQuick.Controls 2.3 (Qt 5.10) \qmlmethod void QtQuick.Controls::Menu::addMenu(Menu menu) Adds \a menu as a sub-menu to the end of this menu. @@ -799,6 +816,23 @@ QQuickMenu *QQuickMenu::takeMenu(int index) /*! \since QtQuick.Controls 2.3 (Qt 5.10) + \qmlmethod Action QtQuick.Controls::Menu::actionAt(int index) + + Returns the action at \a index, or \c null if the index is not valid or + there is no action at the specified index. +*/ +QQuickAction *QQuickMenu::actionAt(int index) const +{ + Q_D(const QQuickMenu); + QQuickAbstractButton *item = qobject_cast<QQuickAbstractButton *>(d->itemAt(index)); + if (!item) + return nullptr; + + return item->action(); +} + +/*! + \since QtQuick.Controls 2.3 (Qt 5.10) \qmlmethod void QtQuick.Controls::Menu::addAction(Action action) Adds \a action to the end of this menu. diff --git a/src/quicktemplates2/qquickmenu_p.h b/src/quicktemplates2/qquickmenu_p.h index b88d380c..a7b86d0e 100644 --- a/src/quicktemplates2/qquickmenu_p.h +++ b/src/quicktemplates2/qquickmenu_p.h @@ -83,11 +83,13 @@ public: void removeItem(QQuickItem *item); // ### Qt 6: Q_INVOKABLE Q_REVISION(3) Q_INVOKABLE QQuickItem *takeItem(int index); + Q_REVISION(3) Q_INVOKABLE QQuickMenu *menuAt(int index) const; Q_REVISION(3) Q_INVOKABLE void addMenu(QQuickMenu *menu); Q_REVISION(3) Q_INVOKABLE void insertMenu(int index, QQuickMenu *menu); Q_REVISION(3) Q_INVOKABLE void removeMenu(QQuickMenu *menu); Q_REVISION(3) Q_INVOKABLE QQuickMenu *takeMenu(int index); + Q_REVISION(3) Q_INVOKABLE QQuickAction *actionAt(int index) const; Q_REVISION(3) Q_INVOKABLE void addAction(QQuickAction *action); Q_REVISION(3) Q_INVOKABLE void insertAction(int index, QQuickAction *action); Q_REVISION(3) Q_INVOKABLE void removeAction(QQuickAction *action); diff --git a/tests/auto/menu/tst_menu.cpp b/tests/auto/menu/tst_menu.cpp index 2397a6ef..1c1030e0 100644 --- a/tests/auto/menu/tst_menu.cpp +++ b/tests/auto/menu/tst_menu.cpp @@ -682,9 +682,18 @@ void tst_menu::actions() QQuickMenu *menu = window->property("menu").value<QQuickMenu *>(); QVERIFY(menu); + QPointer<QQuickAction> action1 = menu->actionAt(0); + QVERIFY(!action1.isNull()); + + QPointer<QQuickAction> action3 = menu->actionAt(2); + QVERIFY(!action3.isNull()); + + QVERIFY(!menu->actionAt(1)); + QVERIFY(!menu->actionAt(3)); + QPointer<QQuickMenuItem> menuItem1 = qobject_cast<QQuickMenuItem *>(menu->itemAt(0)); QVERIFY(!menuItem1.isNull()); - QVERIFY(menuItem1->action()); + QCOMPARE(menuItem1->action(), action1.data()); QCOMPARE(menuItem1->text(), "action1"); QPointer<QQuickMenuItem> menuItem2 = qobject_cast<QQuickMenuItem *>(menu->itemAt(1)); @@ -694,7 +703,7 @@ void tst_menu::actions() QPointer<QQuickMenuItem> menuItem3 = qobject_cast<QQuickMenuItem *>(menu->itemAt(2)); QVERIFY(!menuItem3.isNull()); - QVERIFY(menuItem3->action()); + QCOMPARE(menuItem3->action(), action3.data()); QCOMPARE(menuItem3->text(), "action3"); QPointer<QQuickMenuItem> menuItem4 = qobject_cast<QQuickMenuItem *>(menu->itemAt(3)); @@ -703,8 +712,6 @@ void tst_menu::actions() QCOMPARE(menuItem4->text(), "menuitem4"); // takeAction(int) does not destroy the action, but does destroy the respective item - QPointer<QQuickAction> action1 = menuItem1->action(); - QVERIFY(!action1.isNull()); QCOMPARE(menu->takeAction(0), action1.data()); QVERIFY(!menu->itemAt(3)); QCoreApplication::sendPostedEvents(action1, QEvent::DeferredDelete); @@ -1144,11 +1151,19 @@ void tst_menu::addRemoveSubMenus() QQuickMenu *mainMenu = window->property("mainMenu").value<QQuickMenu *>(); QVERIFY(mainMenu); + QVERIFY(!mainMenu->menuAt(0)); + QPointer<QQuickMenu> subMenu1 = window->property("subMenu1").value<QQuickMenu *>(); QVERIFY(!subMenu1.isNull()); + QCOMPARE(mainMenu->menuAt(1), subMenu1.data()); + + QVERIFY(!mainMenu->menuAt(2)); QPointer<QQuickMenu> subMenu2 = window->property("subMenu2").value<QQuickMenu *>(); QVERIFY(!subMenu2.isNull()); + QCOMPARE(mainMenu->menuAt(3), subMenu2.data()); + + QVERIFY(!mainMenu->menuAt(4)); QPointer<QQuickMenu> subSubMenu1 = window->property("subSubMenu1").value<QQuickMenu *>(); QVERIFY(!subSubMenu1.isNull()); |