From 85af817469daae26e21bb41ceb51b2d21aad8d9e Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 4 Oct 2024 21:20:51 +0200 Subject: [PATCH] QButtonGroup: make sure to always auto-assign negative ids QButtonGroup::addButton() automatically assigns a negative id when no id is given. This logic did not work out when a button with a positive id was added beforehand. Add a check to make sure to always return an auto-assigned negative id. Pick-to: 6.7 6.5 Fixes: QTBUG-129398 Change-Id: Ieadfa44c4b145184a5473713591f4c111a5dafa4 Reviewed-by: Axel Spoerl (cherry picked from commit 772d374ce715de9caaae4f026594d49f6da28dec) Reviewed-by: Qt Cherry-pick Bot --- src/widgets/widgets/qbuttongroup.cpp | 5 ++--- .../widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/widgets/widgets/qbuttongroup.cpp b/src/widgets/widgets/qbuttongroup.cpp index 079ef45e907..db89b137b55 100644 --- a/src/widgets/widgets/qbuttongroup.cpp +++ b/src/widgets/widgets/qbuttongroup.cpp @@ -211,12 +211,11 @@ void QButtonGroup::addButton(QAbstractButton *button, int id) button->d_func()->group = this; d->buttonList.append(button); if (id == -1) { - const QHash::const_iterator it - = std::min_element(d->mapping.cbegin(), d->mapping.cend()); + const auto it = std::min_element(d->mapping.cbegin(), d->mapping.cend()); if (it == d->mapping.cend()) d->mapping[button] = -2; else - d->mapping[button] = *it - 1; + d->mapping[button] = (*it >= 0) ? -2 : (*it - 1); } else { d->mapping[button] = id; } diff --git a/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp b/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp index 566f4ed52ce..a1d27ed4a55 100644 --- a/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp +++ b/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp @@ -539,18 +539,18 @@ void tst_QButtonGroup::autoIncrementId() QRadioButton *radio3 = new QRadioButton(&dlg); radio3->setText("radio3"); - buttons->addButton(radio1); + buttons->addButton(radio1, 2); vbox->addWidget(radio1); - buttons->addButton(radio2); + buttons->addButton(radio2, -1); vbox->addWidget(radio2); buttons->addButton(radio3); vbox->addWidget(radio3); radio1->setChecked(true); - QCOMPARE(buttons->id(radio1), -2); - QCOMPARE(buttons->id(radio2), -3); - QCOMPARE(buttons->id(radio3), -4); + QCOMPARE(buttons->id(radio1), 2); + QCOMPARE(buttons->id(radio2), -2); + QCOMPARE(buttons->id(radio3), -3); dlg.show(); }