Reset button group from attached property

Clearing button group doesn't reset group in the attached property of
the button. This disallow same group to be assigned and didn't
trigger group change event.

This patch clear button group from attached property which inturn
triggers group change event and allow reassigning with same group.

Fixes: QTBUG-111359
Pick-to: 6.5
Change-Id: I06491ac8661cd06d555d430255f5962ee001c07f
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
This commit is contained in:
Santhosh Kumar 2023-02-28 17:31:55 +01:00 committed by Mitch Curtis
parent 2eb1494bdc
commit b6a69e21ac
3 changed files with 72 additions and 7 deletions

View File

@ -497,8 +497,14 @@ QQuickAbstractButton::~QQuickAbstractButton()
{
Q_D(QQuickAbstractButton);
d->removeImplicitSizeListener(d->indicator);
if (d->group)
d->group->removeButton(this);
if (d->group) {
auto *attached = qobject_cast<QQuickButtonGroupAttached *>(
qmlAttachedPropertiesObject<QQuickButtonGroup>(this, false));
if (attached)
attached->setGroup(nullptr);
else
d->group->removeButton(this);
}
#if QT_CONFIG(shortcut)
d->ungrabShortcut();
#endif

View File

@ -143,9 +143,15 @@ public:
void QQuickButtonGroupPrivate::clear()
{
for (QQuickAbstractButton *button : std::as_const(buttons)) {
QQuickAbstractButtonPrivate::get(button)->group = nullptr;
QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, this, &QQuickButtonGroupPrivate::buttonClicked);
QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged, this, &QQuickButtonGroupPrivate::_q_updateCurrent);
auto *attached = qobject_cast<QQuickButtonGroupAttached *>(
qmlAttachedPropertiesObject<QQuickButtonGroup>(button, false));
if (attached) {
attached->setGroup(nullptr);
} else {
QQuickAbstractButtonPrivate::get(button)->group = nullptr;
QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, this, &QQuickButtonGroupPrivate::buttonClicked);
QObjectPrivate::disconnect(button, &QQuickAbstractButton::checkedChanged, this, &QQuickButtonGroupPrivate::_q_updateCurrent);
}
}
buttons.clear();
}
@ -500,11 +506,12 @@ void QQuickButtonGroupAttached::setGroup(QQuickButtonGroup *group)
if (d->group == group)
return;
auto *button = qobject_cast<QQuickAbstractButton *>(parent());
if (d->group)
d->group->removeButton(qobject_cast<QQuickAbstractButton*>(parent()));
d->group->removeButton(button);
d->group = group;
if (group)
group->addButton(qobject_cast<QQuickAbstractButton*>(parent()));
group->addButton(button);
emit groupChanged();
}

View File

@ -417,4 +417,56 @@ TestCase {
mouseClick(column.children[0])
wait(0) // don't crash (QTBUG-62946, QTBUG-63470)
}
Component {
id: buttonGroupComp
Item {
property ButtonGroup buttonGroup: ButtonGroup { }
property int buttonGroupCount: buttonGroup.buttons.length
property int buttonGrpSigCnt: 0
function clearButtonGroup() {
buttonGroup.buttons = []
}
function assignButtonGroup() {
radioButton1.ButtonGroup.group = buttonGroup
}
Column {
RadioButton {
id: radioButton1
visible: false
ButtonGroup.group: buttonGroup
ButtonGroup.onGroupChanged: { (ButtonGroup.group === null) ? --buttonGrpSigCnt : ++buttonGrpSigCnt }
}
RadioButton {
id: radioButton2
visible: false
ButtonGroup.group: buttonGroup
ButtonGroup.onGroupChanged: { (ButtonGroup.group === null) ? --buttonGrpSigCnt : ++buttonGrpSigCnt }
}
}
}
}
function test_resetButtonGroup() {
var container = createTemporaryObject(buttonGroupComp, testCase)
verify(container)
// Check for initial buttons assigned to button group
compare(container.buttonGroupCount, 2)
compare(container.buttonGrpSigCnt, 2)
// Clear buttons in the button group
container.clearButtonGroup()
// Check for buttons in the group and group changed event for buttons
compare(container.buttonGroupCount, 0)
compare(container.buttonGrpSigCnt, 0)
// Assign same group to the button
container.assignButtonGroup()
// Check for group change event from the button
compare(container.buttonGroupCount, 1)
compare(container.buttonGrpSigCnt, 1)
}
}