diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-05-27 09:05:48 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-06-06 18:16:50 +0000 |
commit | d0a48ae26a807fcabd9ed6af3b863a4a2b643cdb (patch) | |
tree | 0aab82c1303a8b5d962ead6275522f5a39633a5a | |
parent | 3ec6f508aa485b1162d7d8f7bc57401b43ded470 (diff) |
Add ButtonGroup::clicked(AbstractButton) signal
[ChangeLog][ButtonGroup] Added clicked(AbstractButton) signal
for centralized click handling for grouped buttons.
Change-Id: Ib64d360db211d2763f6237e411152a2a395fd2b5
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/imports/controls/qtquickcontrols2plugin.cpp | 1 | ||||
-rw-r--r-- | src/imports/templates/qtquicktemplates2plugin.cpp | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickbuttongroup.cpp | 38 | ||||
-rw-r--r-- | src/quicktemplates2/qquickbuttongroup_p.h | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_buttongroup.qml | 31 |
5 files changed, 72 insertions, 0 deletions
diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp index 756467e5..db12cbb5 100644 --- a/src/imports/controls/qtquickcontrols2plugin.cpp +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -136,6 +136,7 @@ void QtQuickControls2Plugin::registerTypes(const char *uri) qmlRegisterType(selector.select(QStringLiteral("Tumbler.qml")), uri, 2, 0, "Tumbler"); // QtQuick.Controls 2.1 (Qt 5.8) + qmlRegisterType<QQuickButtonGroup,1 >(uri, 2, 1, "ButtonGroup"); qmlRegisterType(selector.select(QStringLiteral("StackView.qml")), uri, 2, 1, "StackView"); qmlRegisterType(selector.select(QStringLiteral("SwipeView.qml")), uri, 2, 1, "SwipeView"); } diff --git a/src/imports/templates/qtquicktemplates2plugin.cpp b/src/imports/templates/qtquicktemplates2plugin.cpp index bfd3a71b..92082f8a 100644 --- a/src/imports/templates/qtquicktemplates2plugin.cpp +++ b/src/imports/templates/qtquicktemplates2plugin.cpp @@ -173,6 +173,7 @@ void QtQuickTemplates2Plugin::registerTypes(const char *uri) qmlRegisterRevision<QQuickTextEdit, 7>(uri, 2, 0); // QtQuick.Controls 2.1 (Qt 5.8) + qmlRegisterType<QQuickButtonGroup>(uri, 2, 1, "ButtonGroup"); qmlRegisterType<QQuickStackView>(uri, 2, 1, "StackView"); qmlRegisterType<QQuickSwipeView>(uri, 2, 1, "SwipeView"); } diff --git a/src/quicktemplates2/qquickbuttongroup.cpp b/src/quicktemplates2/qquickbuttongroup.cpp index 0b134267..bc9a092f 100644 --- a/src/quicktemplates2/qquickbuttongroup.cpp +++ b/src/quicktemplates2/qquickbuttongroup.cpp @@ -123,6 +123,32 @@ QT_BEGIN_NAMESPACE \sa RadioButton */ +/*! + \qmlsignal QtQuick.Controls::ButtonGroup::clicked(AbstractButton button) + \since QtQuick.Controls 2.1 + + This signal is emitted when a \a button in the group has been clicked. + + This signal is convenient for implementing a common signal handler for + all buttons in the same group. + + \code + ButtonGroup { + buttons: column.children + onClicked: console.log("clicked:", button.text) + } + + Column { + id: column + Button { text: "First" } + Button { text: "Second" } + Button { text: "Third" } + } + \endcode + + \sa AbstractButton::clicked() +*/ + class QQuickButtonGroupPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QQuickButtonGroup) @@ -131,6 +157,7 @@ public: QQuickButtonGroupPrivate() : checkedButton(nullptr) { } void clear(); + void buttonClicked(); void _q_updateCurrent(); static void buttons_append(QQmlListProperty<QQuickAbstractButton> *prop, QQuickAbstractButton *obj); @@ -146,11 +173,20 @@ void QQuickButtonGroupPrivate::clear() { for (QQuickAbstractButton *button : qAsConst(buttons)) { QQuickAbstractButtonPrivate::get(button)->group = nullptr; + QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, this, &QQuickButtonGroupPrivate::buttonClicked); QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged, this, &QQuickButtonGroupPrivate::_q_updateCurrent); } buttons.clear(); } +void QQuickButtonGroupPrivate::buttonClicked() +{ + Q_Q(QQuickButtonGroup); + QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender()); + if (button) + emit q->clicked(button); +} + void QQuickButtonGroupPrivate::_q_updateCurrent() { Q_Q(QQuickButtonGroup); @@ -289,6 +325,7 @@ void QQuickButtonGroup::addButton(QQuickAbstractButton *button) return; QQuickAbstractButtonPrivate::get(button)->group = this; + QObjectPrivate::connect(button, &QQuickAbstractButton::clicked, d, &QQuickButtonGroupPrivate::buttonClicked); QObjectPrivate::connect(button, &QQuickAbstractButton::checkedChanged, d, &QQuickButtonGroupPrivate::_q_updateCurrent); if (button->isChecked()) @@ -316,6 +353,7 @@ void QQuickButtonGroup::removeButton(QQuickAbstractButton *button) return; QQuickAbstractButtonPrivate::get(button)->group = nullptr; + QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, d, &QQuickButtonGroupPrivate::buttonClicked); QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged, d, &QQuickButtonGroupPrivate::_q_updateCurrent); if (d->checkedButton == button) diff --git a/src/quicktemplates2/qquickbuttongroup_p.h b/src/quicktemplates2/qquickbuttongroup_p.h index baf4e13f..2202ae2f 100644 --- a/src/quicktemplates2/qquickbuttongroup_p.h +++ b/src/quicktemplates2/qquickbuttongroup_p.h @@ -83,6 +83,7 @@ public Q_SLOTS: Q_SIGNALS: void checkedButtonChanged(); void buttonsChanged(); + Q_REVISION(1) void clicked(QQuickAbstractButton *button); private: Q_DISABLE_COPY(QQuickButtonGroup) diff --git a/tests/auto/controls/data/tst_buttongroup.qml b/tests/auto/controls/data/tst_buttongroup.qml index bb0ffe00..91bc3aa1 100644 --- a/tests/auto/controls/data/tst_buttongroup.qml +++ b/tests/auto/controls/data/tst_buttongroup.qml @@ -65,6 +65,11 @@ TestCase { signalName: "buttonsChanged" } + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + function init() { verify(!checkedButtonSpy.target) compare(checkedButtonSpy.count, 0) @@ -217,6 +222,32 @@ TestCase { group.destroy() } + function test_clicked() { + var group = buttonGroup.createObject(testCase) + verify(group) + + clickedSpy.target = group + verify(clickedSpy.valid) + + var button1 = button.createObject(testCase) + var button2 = button.createObject(testCase) + + group.addButton(button1) + group.addButton(button2) + + button1.clicked() + compare(clickedSpy.count, 1) + compare(clickedSpy.signalArguments[0][0], button1) + + button2.clicked() + compare(clickedSpy.count, 2) + compare(clickedSpy.signalArguments[1][0], button2) + + group.destroy() + button1.destroy() + button2.destroy() + } + Component { id: checkBoxes Item { |