Qt 6.x
The Qt SDK
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
134
135 bool complete = true;
136 bool exclusive = true;
137 bool settingCheckState = false;
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
206{
207 QQuickButtonGroup *q = static_cast<QQuickButtonGroup *>(prop->object);
208 q->addButton(obj);
209}
210
212{
214 return p->buttons.size();
215}
216
218{
220 return p->buttons.value(index);
221}
222
224{
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
237{
238}
239
241{
243 d->clear();
244}
245
247{
248 return new QQuickButtonGroupAttached(object);
249}
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
308{
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
404{
406 if (!button || d->buttons.contains(button))
407 return;
408
412
413 if (d->exclusive && button->isChecked())
415
416 d->buttons.append(button);
417 d->updateCheckState();
419}
420
433{
435 if (!button || !d->buttons.contains(button))
436 return;
437
441
442 if (d->checkedButton == button)
443 setCheckedButton(nullptr);
444
445 d->buttons.removeOne(button);
446 d->updateCheckState();
448}
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
472{
473}
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
Definition qlist.h:74
qsizetype size() const noexcept
Definition qlist.h:386
bool isEmpty() const noexcept
Definition qlist.h:390
T value(qsizetype i) const
Definition qlist.h:661
void clear()
Definition qlist.h:417
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:298
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:327
\inmodule QtCore
Definition qobject.h:90
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:311
\inmodule QtCore
Definition qpointer.h:18
The QQmlListProperty class allows applications to expose list-like properties of QObject-derived clas...
Definition qqmllist.h:24
QObject * object
Definition qqmllist.h:81
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:70
bool contains(const AT &t) const noexcept
Definition qlist.h:44
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...
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent