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:
parent
2eb1494bdc
commit
b6a69e21ac
|
@ -497,8 +497,14 @@ QQuickAbstractButton::~QQuickAbstractButton()
|
|||
{
|
||||
Q_D(QQuickAbstractButton);
|
||||
d->removeImplicitSizeListener(d->indicator);
|
||||
if (d->group)
|
||||
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
|
||||
|
|
|
@ -143,10 +143,16 @@ public:
|
|||
void QQuickButtonGroupPrivate::clear()
|
||||
{
|
||||
for (QQuickAbstractButton *button : std::as_const(buttons)) {
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue