Add missing nullptr check in QWidget::setFocusProxy
b1802a164b8682ed9e8956a5a19a90ade65c25d0 added handling for a parent to become focus proxy of a child. The respective 'else if' branch didn't check whether setFocusProxy() was called with a nullptr argument. This patch adds the missing nullptr check. It also adds functionality to tst_QWidget::tabOrderComboBox() to test the removal of a focus proxy, as well as the complete removal of an element from the focus chain. Change-Id: I4cb865b9ac4497fc5e2595910738fb77694f5837 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
ac0953c34d
commit
72d6768ec1
@ -6412,7 +6412,7 @@ void QWidget::setFocusProxy(QWidget * w)
|
|||||||
d->focus_prev = oldPrev;
|
d->focus_prev = oldPrev;
|
||||||
oldPrev->d_func()->focus_next = this;
|
oldPrev->d_func()->focus_next = this;
|
||||||
firstChild->d_func()->focus_prev = this;
|
firstChild->d_func()->focus_prev = this;
|
||||||
} else if (w->isAncestorOf(this)) {
|
} else if (w && w->isAncestorOf(this)) {
|
||||||
// If the focus proxy is a parent, 'this' has to be inserted directly after its parent in the focus chain
|
// If the focus proxy is a parent, 'this' has to be inserted directly after its parent in the focus chain
|
||||||
// remove it from the chain and insert this into the focus chain after its parent
|
// remove it from the chain and insert this into the focus chain after its parent
|
||||||
|
|
||||||
|
@ -2144,6 +2144,7 @@ void tst_QWidget::tabOrderComboBox()
|
|||||||
QFETCH(const QList<int>, secondTabOrder);
|
QFETCH(const QList<int>, secondTabOrder);
|
||||||
const int count = firstTabOrder.count();
|
const int count = firstTabOrder.count();
|
||||||
Q_ASSERT(count == secondTabOrder.count());
|
Q_ASSERT(count == secondTabOrder.count());
|
||||||
|
Q_ASSERT(count > 1);
|
||||||
|
|
||||||
QWidget w;
|
QWidget w;
|
||||||
w.setObjectName("MainWidget");
|
w.setObjectName("MainWidget");
|
||||||
@ -2176,6 +2177,31 @@ void tst_QWidget::tabOrderComboBox()
|
|||||||
|
|
||||||
COMPARE(secondTabOrder);
|
COMPARE(secondTabOrder);
|
||||||
|
|
||||||
|
// Remove the focus proxy of the first combobox's line edit.
|
||||||
|
QComboBox *box = boxes.at(0);
|
||||||
|
QLineEdit *lineEdit = box->lineEdit();
|
||||||
|
QWidgetPrivate *lePriv = QWidgetPrivate::get(lineEdit);
|
||||||
|
const QWidget *prev = lePriv->focus_prev;
|
||||||
|
const QWidget *next = lePriv->focus_next;
|
||||||
|
const QWidget *proxy = lePriv->extra->focus_proxy;
|
||||||
|
QCOMPARE(proxy, box);
|
||||||
|
lineEdit->setFocusProxy(nullptr);
|
||||||
|
QCOMPARE(lePriv->extra->focus_proxy, nullptr);
|
||||||
|
QCOMPARE(lePriv->focus_prev, prev);
|
||||||
|
QCOMPARE(lePriv->focus_next, next);
|
||||||
|
|
||||||
|
// Remove first item and check chain consistency
|
||||||
|
boxes.removeFirst();
|
||||||
|
delete box;
|
||||||
|
|
||||||
|
// Create new list with 0 removed and other indexes updated
|
||||||
|
QList<int> thirdTabOrder(secondTabOrder);
|
||||||
|
thirdTabOrder.removeIf([](int i){ return i == 0; });
|
||||||
|
for (int &i : thirdTabOrder)
|
||||||
|
--i;
|
||||||
|
|
||||||
|
COMPARE(thirdTabOrder);
|
||||||
|
|
||||||
#undef COMPARE
|
#undef COMPARE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user