6#include <QtCore/private/qobject_p.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qvariant.h>
9#include <QtQml/qqmlinfo.h>
16
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
117
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
147 Q_DECLARE_PUBLIC(QQuickButtonGroup)
155 static void buttons_append(QQmlListProperty<QQuickAbstractButton> *prop, QQuickAbstractButton *obj);
157 static QQuickAbstractButton *
buttons_at(QQmlListProperty<QQuickAbstractButton> *prop, qsizetype index);
170 for (QQuickAbstractButton *button : std::as_const(buttons)) {
171 auto *attached = qobject_cast<QQuickButtonGroupAttached *>(
172 qmlAttachedPropertiesObject<QQuickButtonGroup>(button,
false));
174 attached->setGroup(
nullptr);
176 QQuickAbstractButtonPrivate::get(button)->group =
nullptr;
177 QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked,
this, &QQuickButtonGroupPrivate::buttonClicked);
178 QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged,
this, &QQuickButtonGroupPrivate::_q_updateCurrent);
186 Q_Q(QQuickButtonGroup);
187 QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender());
189 emit q->clicked(button);
194 Q_Q(QQuickButtonGroup);
196 QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(q->sender());
197 if (button && button->isChecked())
198 q->setCheckedButton(button);
199 else if (!buttons.contains(checkedButton))
200 q->setCheckedButton(
nullptr);
210 bool anyChecked =
false;
211 bool allChecked = !buttons.isEmpty();
212 for (QQuickAbstractButton *button : std::as_const(buttons)) {
213 const bool isChecked = button->isChecked();
214 anyChecked |= isChecked;
215 allChecked &= isChecked;
217 setCheckState(Qt::CheckState(anyChecked + allChecked));
222 Q_Q(QQuickButtonGroup);
223 if (checkState == state)
227 emit q->checkStateChanged();
232 QQuickButtonGroup *q =
static_cast<QQuickButtonGroup *>(prop->object);
239 return p->buttons.size();
245 return p->buttons.value(index);
251 if (!p->buttons.isEmpty()) {
253 QQuickButtonGroup *q =
static_cast<QQuickButtonGroup *>(prop->object);
255 QMetaObject::invokeMethod(q,
"_q_updateCurrent", Qt::QueuedConnection);
256 emit q->buttonsChanged();
260QQuickButtonGroup::QQuickButtonGroup(QObject *parent)
261 : QObject(*(
new QQuickButtonGroupPrivate), parent)
265QQuickButtonGroup::~QQuickButtonGroup()
267 Q_D(QQuickButtonGroup);
271QQuickButtonGroupAttached *QQuickButtonGroup::qmlAttachedProperties(QObject *object)
273 return new QQuickButtonGroupAttached(object);
277
278
279
280
281
282
283
284
285
286QQuickAbstractButton *QQuickButtonGroup::checkedButton()
const
288 Q_D(
const QQuickButtonGroup);
289 return d->checkedButton;
292void QQuickButtonGroup::setCheckedButton(QQuickAbstractButton *checkedButton)
294 Q_D(QQuickButtonGroup);
295 if (d->checkedButton == checkedButton)
298 if (d->checkedButton)
299 d->checkedButton->setChecked(
false);
300 d->checkedButton = checkedButton;
302 checkedButton->setChecked(
true);
303 emit checkedButtonChanged();
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332QQmlListProperty<QQuickAbstractButton> QQuickButtonGroup::buttons()
334 Q_D(QQuickButtonGroup);
335 return QQmlListProperty<QQuickAbstractButton>(
this, d,
336 QQuickButtonGroupPrivate::buttons_append,
337 QQuickButtonGroupPrivate::buttons_count,
338 QQuickButtonGroupPrivate::buttons_at,
339 QQuickButtonGroupPrivate::buttons_clear);
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358bool QQuickButtonGroup::isExclusive()
const
360 Q_D(
const QQuickButtonGroup);
364void QQuickButtonGroup::setExclusive(
bool exclusive)
366 Q_D(QQuickButtonGroup);
367 if (d->exclusive == exclusive)
370 d->exclusive = exclusive;
371 emit exclusiveChanged();
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393Qt::CheckState QQuickButtonGroup::checkState()
const
395 Q_D(
const QQuickButtonGroup);
396 return d->checkState;
399void QQuickButtonGroup::setCheckState(Qt::CheckState state)
401 Q_D(QQuickButtonGroup);
402 if (d->checkState == state || state == Qt::PartiallyChecked)
405 d->settingCheckState =
true;
407 if (d->checkedButton && state == Qt::Unchecked)
408 setCheckedButton(
nullptr);
410 for (QQuickAbstractButton *button : std::as_const(d->buttons))
411 button->setChecked(state == Qt::Checked);
413 d->settingCheckState =
false;
414 d->setCheckState(state);
418
419
420
421
422
423
424
425
426
427
428void QQuickButtonGroup::addButton(QQuickAbstractButton *button)
430 Q_D(QQuickButtonGroup);
431 if (!button || d->buttons.contains(button))
434 QQuickAbstractButtonPrivate::get(button)->group =
this;
435 QObjectPrivate::connect(button, &QQuickAbstractButton::clicked, d, &QQuickButtonGroupPrivate::buttonClicked);
436 QObjectPrivate::connect(button, &QQuickAbstractButton::checkedChanged, d, &QQuickButtonGroupPrivate::_q_updateCurrent);
438 if (d->exclusive && button->isChecked())
439 setCheckedButton(button);
441 d->buttons.append(button);
442 d->updateCheckState();
443 emit buttonsChanged();
447
448
449
450
451
452
453
454
455
456
457void QQuickButtonGroup::removeButton(QQuickAbstractButton *button)
459 Q_D(QQuickButtonGroup);
460 if (!button || !d->buttons.contains(button))
463 QQuickAbstractButtonPrivate::get(button)->group =
nullptr;
464 QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, d, &QQuickButtonGroupPrivate::buttonClicked);
465 QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged, d, &QQuickButtonGroupPrivate::_q_updateCurrent);
467 if (d->checkedButton == button)
468 setCheckedButton(
nullptr);
470 d->buttons.removeOne(button);
471 d->updateCheckState();
472 emit buttonsChanged();
475void QQuickButtonGroup::classBegin()
477 Q_D(QQuickButtonGroup);
481void QQuickButtonGroup::componentComplete()
483 Q_D(QQuickButtonGroup);
485 if (!d->buttons.isEmpty())
486 d->updateCheckState();
495QQuickButtonGroupAttached::QQuickButtonGroupAttached(QObject *parent)
496 : QObject(*(
new QQuickButtonGroupAttachedPrivate), parent)
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522QQuickButtonGroup *QQuickButtonGroupAttached::group()
const
524 Q_D(
const QQuickButtonGroupAttached);
528void QQuickButtonGroupAttached::setGroup(QQuickButtonGroup *group)
530 Q_D(QQuickButtonGroupAttached);
531 if (d->group == group)
534 auto *button = qobject_cast<QQuickAbstractButton *>(parent());
536 d->group->removeButton(button);
539 group->addButton(button);
545#include "moc_qquickbuttongroup_p.cpp"
Combined button and popup list for selecting options.