Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickbuttongroup.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtCore/private/qobject_p.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qvariant.h>
9#include <QtQml/qqmlinfo.h>
10
12
14
19
120{
121public:
122 Q_DECLARE_PUBLIC(QQuickButtonGroup)
123
124 void clear();
125 void buttonClicked();
126 void _q_updateCurrent();
127 void updateCheckState();
129
130 static void buttons_append(QQmlListProperty<QQuickAbstractButton> *prop, QQuickAbstractButton *obj);
131 static qsizetype buttons_count(QQmlListProperty<QQuickAbstractButton> *prop);
132 static QQuickAbstractButton *buttons_at(QQmlListProperty<QQuickAbstractButton> *prop, qsizetype index);
133 static void buttons_clear(QQmlListProperty<QQuickAbstractButton> *prop);
134
135 bool complete = true;
136 bool exclusive = true;
137 bool settingCheckState = false;
139 QPointer<QQuickAbstractButton> checkedButton;
140 QList<QQuickAbstractButton*> buttons;
141};
142
144{
145 for (QQuickAbstractButton *button : std::as_const(buttons)) {
146 auto *attached = qobject_cast<QQuickButtonGroupAttached *>(
147 qmlAttachedPropertiesObject<QQuickButtonGroup>(button, false));
148 if (attached) {
149 attached->setGroup(nullptr);
150 } else {
154 }
155 }
156 buttons.clear();
157}
158
160{
162 QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender());
163 if (button)
164 emit q->clicked(button);
165}
166
168{
170 if (exclusive) {
171 QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender());
172 if (button && button->isChecked())
173 q->setCheckedButton(button);
174 else if (!buttons.contains(checkedButton))
175 q->setCheckedButton(nullptr);
176 }
178}
179
181{
183 return;
184
185 bool anyChecked = false;
186 bool allChecked = !buttons.isEmpty();
187 for (QQuickAbstractButton *button : std::as_const(buttons)) {
188 const bool isChecked = button->isChecked();
189 anyChecked |= isChecked;
190 allChecked &= isChecked;
191 }
192 setCheckState(Qt::CheckState(anyChecked + allChecked));
193}
194
196{
198 if (checkState == state)
199 return;
200
202 emit q->checkStateChanged();
203}
204
205void QQuickButtonGroupPrivate::buttons_append(QQmlListProperty<QQuickAbstractButton> *prop, QQuickAbstractButton *obj)
206{
207 QQuickButtonGroup *q = static_cast<QQuickButtonGroup *>(prop->object);
208 q->addButton(obj);
209}
210
211qsizetype QQuickButtonGroupPrivate::buttons_count(QQmlListProperty<QQuickAbstractButton> *prop)
212{
213 QQuickButtonGroupPrivate *p = static_cast<QQuickButtonGroupPrivate *>(prop->data);
214 return p->buttons.size();
215}
216
217QQuickAbstractButton *QQuickButtonGroupPrivate::buttons_at(QQmlListProperty<QQuickAbstractButton> *prop, qsizetype index)
218{
219 QQuickButtonGroupPrivate *p = static_cast<QQuickButtonGroupPrivate *>(prop->data);
220 return p->buttons.value(index);
221}
222
223void QQuickButtonGroupPrivate::buttons_clear(QQmlListProperty<QQuickAbstractButton> *prop)
224{
225 QQuickButtonGroupPrivate *p = static_cast<QQuickButtonGroupPrivate *>(prop->data);
226 if (!p->buttons.isEmpty()) {
227 p->clear();
228 QQuickButtonGroup *q = static_cast<QQuickButtonGroup *>(prop->object);
229 // QTBUG-52358: don't clear the checked button immediately
231 emit q->buttonsChanged();
232 }
233}
234
239
245
250
262{
263 Q_D(const QQuickButtonGroup);
264 return d->checkedButton;
265}
266
268{
270 if (d->checkedButton == checkedButton)
271 return;
272
273 if (d->checkedButton)
274 d->checkedButton->setChecked(false);
275 d->checkedButton = checkedButton;
276 if (checkedButton)
279}
280
307QQmlListProperty<QQuickAbstractButton> QQuickButtonGroup::buttons()
308{
310 return QQmlListProperty<QQuickAbstractButton>(this, d,
315}
316
334{
335 Q_D(const QQuickButtonGroup);
336 return d->exclusive;
337}
338
340{
342 if (d->exclusive == exclusive)
343 return;
344
345 d->exclusive = exclusive;
346 emit exclusiveChanged();
347}
348
369{
370 Q_D(const QQuickButtonGroup);
371 return d->checkState;
372}
373
375{
377 if (d->checkState == state || state == Qt::PartiallyChecked)
378 return;
379
380 d->settingCheckState = true;
381 if (d->exclusive) {
382 if (d->checkedButton && state == Qt::Unchecked)
383 setCheckedButton(nullptr);
384 } else {
385 for (QQuickAbstractButton *button : std::as_const(d->buttons))
387 }
388 d->settingCheckState = false;
389 d->setCheckState(state);
390}
391
420
449
451{
453 d->complete = false;
454}
455
457{
459 d->complete = true;
460 if (!d->buttons.isEmpty())
461 d->updateCheckState();
462}
463
465{
466public:
468};
469
474
498{
499 Q_D(const QQuickButtonGroupAttached);
500 return d->group;
501}
502
504{
506 if (d->group == group)
507 return;
508
509 auto *button = qobject_cast<QQuickAbstractButton *>(parent());
510 if (d->group)
511 d->group->removeButton(button);
512 d->group = group;
513 if (group)
516}
517
519
520#include "moc_qquickbuttongroup_p.cpp"
bool isChecked() const
qsizetype size() const noexcept
Definition qlist.h:397
bool isEmpty() const noexcept
Definition qlist.h:401
T value(qsizetype i) const
Definition qlist.h:664
void clear()
Definition qlist.h:434
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
Definition qobject_p.h:299
static bool disconnect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot)
Definition qobject_p.h:328
\inmodule QtCore
Definition qobject.h:103
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
static QQuickAbstractButtonPrivate * get(QQuickAbstractButton *button)
void setChecked(bool checked)
QQuickButtonGroupAttached(QObject *parent=nullptr)
void setGroup(QQuickButtonGroup *group)
Mutually-exclusive group of checkable buttons.
static QQuickAbstractButton * buttons_at(QQmlListProperty< QQuickAbstractButton > *prop, qsizetype index)
void setCheckState(Qt::CheckState state)
static qsizetype buttons_count(QQmlListProperty< QQuickAbstractButton > *prop)
QList< QQuickAbstractButton * > buttons
static void buttons_clear(QQmlListProperty< QQuickAbstractButton > *prop)
static void buttons_append(QQmlListProperty< QQuickAbstractButton > *prop, QQuickAbstractButton *obj)
QPointer< QQuickAbstractButton > checkedButton
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void removeButton(QQuickAbstractButton *button)
\qmlmethod void QtQuick.Controls::ButtonGroup::removeButton(AbstractButton button)
Qt::CheckState checkState
void classBegin() override
Invoked after class creation, but before any properties have been set.
void addButton(QQuickAbstractButton *button)
\qmlmethod void QtQuick.Controls::ButtonGroup::addButton(AbstractButton button)
void setCheckedButton(QQuickAbstractButton *checkedButton)
QQmlListProperty< QQuickAbstractButton > buttons
\qmlproperty list<AbstractButton> QtQuick.Controls::ButtonGroup::buttons
void setCheckState(Qt::CheckState state)
void checkedButtonChanged()
QQuickButtonGroup(QObject *parent=nullptr)
static QQuickButtonGroupAttached * qmlAttachedProperties(QObject *object)
QQuickAbstractButton * checkedButton
void setExclusive(bool exclusive)
QPushButton * button
[2]
else opt state
[0]
Combined button and popup list for selecting options.
CheckState
@ Unchecked
@ Checked
@ PartiallyChecked
@ QueuedConnection
GLuint index
[2]
GLboolean GLuint group
GLhandleARB obj
[2]
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
#define emit
ptrdiff_t qsizetype
Definition qtypes.h:165
bool contains(const AT &t) const noexcept
Definition qlist.h:45
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...