7#include <QtCore/private/qobject_p.h>
8#include <QtCore/qmetaobject.h>
9#include <QtCore/qvariant.h>
10#include <QtQml/qqmlinfo.h>
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
148 Q_DECLARE_PUBLIC(QQuickButtonGroup)
156 static void buttons_append(QQmlListProperty<QQuickAbstractButton> *prop, QQuickAbstractButton *obj);
158 static QQuickAbstractButton *
buttons_at(QQmlListProperty<QQuickAbstractButton> *prop, qsizetype index);
171 for (QQuickAbstractButton *button : std::as_const(buttons)) {
172 auto *attached = qobject_cast<QQuickButtonGroupAttached *>(
173 qmlAttachedPropertiesObject<QQuickButtonGroup>(button,
false));
175 attached->setGroup(
nullptr);
177 QQuickAbstractButtonPrivate::get(button)->group =
nullptr;
178 QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked,
this, &QQuickButtonGroupPrivate::buttonClicked);
179 QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged,
this, &QQuickButtonGroupPrivate::_q_updateCurrent);
187 Q_Q(QQuickButtonGroup);
188 QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender());
190 emit q->clicked(button);
195 Q_Q(QQuickButtonGroup);
197 QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender());
198 if (button && button->isChecked())
199 q->setCheckedButton(button);
200 else if (!buttons.contains(checkedButton))
201 q->setCheckedButton(
nullptr);
211 bool anyChecked =
false;
212 bool allChecked = !buttons.isEmpty();
213 for (QQuickAbstractButton *button : std::as_const(buttons)) {
214 const bool isChecked = button->isChecked();
215 anyChecked |= isChecked;
216 allChecked &= isChecked;
218 setCheckState(Qt::CheckState(anyChecked + allChecked));
223 Q_Q(QQuickButtonGroup);
224 if (checkState == state)
228 emit q->checkStateChanged();
233 QQuickButtonGroup *q =
static_cast<QQuickButtonGroup *>(prop->object);
240 return p->buttons.size();
246 return p->buttons.value(index);
252 if (!p->buttons.isEmpty()) {
254 QQuickButtonGroup *q =
static_cast<QQuickButtonGroup *>(prop->object);
256 QMetaObject::invokeMethod(q,
"_q_updateCurrent", Qt::QueuedConnection);
257 emit q->buttonsChanged();
261QQuickButtonGroup::QQuickButtonGroup(QObject *parent)
262 : QObject(*(
new QQuickButtonGroupPrivate), parent)
266QQuickButtonGroup::~QQuickButtonGroup()
268 Q_D(QQuickButtonGroup);
272QQuickButtonGroupAttached *QQuickButtonGroup::qmlAttachedProperties(QObject *object)
274 return new QQuickButtonGroupAttached(object);
278
279
280
281
282
283
284
285
286
287QQuickAbstractButton *QQuickButtonGroup::checkedButton()
const
289 Q_D(
const QQuickButtonGroup);
290 return d->checkedButton;
293void QQuickButtonGroup::setCheckedButton(QQuickAbstractButton *checkedButton)
295 Q_D(QQuickButtonGroup);
296 if (d->checkedButton == checkedButton)
299 if (d->checkedButton)
300 d->checkedButton->setChecked(
false);
301 d->checkedButton = checkedButton;
303 checkedButton->setChecked(
true);
304 emit checkedButtonChanged();
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333QQmlListProperty<QQuickAbstractButton> QQuickButtonGroup::buttons()
335 Q_D(QQuickButtonGroup);
336 return QQmlListProperty<QQuickAbstractButton>(
this, d,
337 QQuickButtonGroupPrivate::buttons_append,
338 QQuickButtonGroupPrivate::buttons_count,
339 QQuickButtonGroupPrivate::buttons_at,
340 QQuickButtonGroupPrivate::buttons_clear);
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359bool QQuickButtonGroup::isExclusive()
const
361 Q_D(
const QQuickButtonGroup);
365void QQuickButtonGroup::setExclusive(
bool exclusive)
367 Q_D(QQuickButtonGroup);
368 if (d->exclusive == exclusive)
371 d->exclusive = exclusive;
372 emit exclusiveChanged();
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394Qt::CheckState QQuickButtonGroup::checkState()
const
396 Q_D(
const QQuickButtonGroup);
397 return d->checkState;
400void QQuickButtonGroup::setCheckState(Qt::CheckState state)
402 Q_D(QQuickButtonGroup);
403 if (d->checkState == state || state == Qt::PartiallyChecked)
406 d->settingCheckState =
true;
408 if (d->checkedButton && state == Qt::Unchecked)
409 setCheckedButton(
nullptr);
411 for (QQuickAbstractButton *button : std::as_const(d->buttons))
412 button->setChecked(state == Qt::Checked);
414 d->settingCheckState =
false;
415 d->setCheckState(state);
419
420
421
422
423
424
425
426
427
428
429void QQuickButtonGroup::addButton(QQuickAbstractButton *button)
431 Q_D(QQuickButtonGroup);
432 if (!button || d->buttons.contains(button))
435 QQuickAbstractButtonPrivate::get(button)->group =
this;
436 QObjectPrivate::connect(button, &QQuickAbstractButton::clicked, d, &QQuickButtonGroupPrivate::buttonClicked);
437 QObjectPrivate::connect(button, &QQuickAbstractButton::checkedChanged, d, &QQuickButtonGroupPrivate::_q_updateCurrent);
439 if (d->exclusive && button->isChecked())
440 setCheckedButton(button);
442 d->buttons.append(button);
443 d->updateCheckState();
444 emit buttonsChanged();
448
449
450
451
452
453
454
455
456
457
458void QQuickButtonGroup::removeButton(QQuickAbstractButton *button)
460 Q_D(QQuickButtonGroup);
461 if (!button || !d->buttons.contains(button))
464 QQuickAbstractButtonPrivate::get(button)->group =
nullptr;
465 QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, d, &QQuickButtonGroupPrivate::buttonClicked);
466 QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged, d, &QQuickButtonGroupPrivate::_q_updateCurrent);
468 if (d->checkedButton == button)
469 setCheckedButton(
nullptr);
471 d->buttons.removeOne(button);
472 d->updateCheckState();
473 emit buttonsChanged();
476void QQuickButtonGroup::classBegin()
478 Q_D(QQuickButtonGroup);
482void QQuickButtonGroup::componentComplete()
484 Q_D(QQuickButtonGroup);
486 if (!d->buttons.isEmpty())
487 d->updateCheckState();
496QQuickButtonGroupAttached::QQuickButtonGroupAttached(QObject *parent)
497 : QObject(*(
new QQuickButtonGroupAttachedPrivate), parent)
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523QQuickButtonGroup *QQuickButtonGroupAttached::group()
const
525 Q_D(
const QQuickButtonGroupAttached);
529void QQuickButtonGroupAttached::setGroup(QQuickButtonGroup *group)
531 Q_D(QQuickButtonGroupAttached);
532 if (d->group == group)
535 auto *button = qobject_cast<QQuickAbstractButton *>(parent());
537 d->group->removeButton(button);
540 group->addButton(button);
546#include "moc_qquickbuttongroup_p.cpp"