From f8db2b996f339ad7e0754cd232f1e71ebecf6367 Mon Sep 17 00:00:00 2001 From: Oliver Eftevaag Date: Fri, 11 Jun 2021 14:06:57 +0200 Subject: QQuickComboBox: fix acceptableInput being wrong if no validator was set This patch fixes an issue with hasAcceptableInput(), if the property would be read before the contentItem had been set by the qml engine. This would cause hasAcceptableInput to return false by default, even though the default value is supposed to be true, if no validators or inputMasks are being used. The solution that I've chosen, is to give the QQuickComboBox its own acceptableInput variable, and connect the contentItem's acceptableInputChanged() signal to a function that polls for the contentItem property, and updates its variable accordingly. Fixes: QTBUG-94307 Pick-to: 6.2 6.1 5.15 Change-Id: I587d76162e75544a7ed1df9e3b9104bd73013bb0 Reviewed-by: Mitch Curtis --- tests/auto/controls/data/tst_combobox.qml | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'tests/auto') diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml index 460c490a..5359f63c 100644 --- a/tests/auto/controls/data/tst_combobox.qml +++ b/tests/auto/controls/data/tst_combobox.qml @@ -157,6 +157,7 @@ TestCase { verify(control.delegate) verify(control.indicator) verify(control.popup) + verify(control.acceptableInput) compare(control.inputMethodHints, Qt.ImhNoPredictiveText) } @@ -2240,4 +2241,43 @@ TestCase { verify(control.activeFocus) verify(control.contentItem.focus) } + + Component { + id: intValidatorComponent + IntValidator { + bottom: 0 + top: 255 + } + } + + function test_acceptableInput_QTBUG_94307() { + let items = [ + { text: "A" }, + { text: "2" }, + { text: "3" } + ] + let control = createTemporaryObject(comboBox, testCase, {model: items, editable: true}) + verify(control) + + verify(control.acceptableInput) + compare(control.displayText, "A") + + let acceptableInputSpy = signalSpy.createObject(control, {target: control, signalName: "acceptableInputChanged"}) + verify(acceptableInputSpy.valid) + + let intValidator = intValidatorComponent.createObject(testCase) + verify(intValidator) + + control.validator = intValidator + + compare(acceptableInputSpy.count, 1) + compare(control.displayText, "A") + compare(control.acceptableInput, false) + + control.currentIndex = 1 + + compare(acceptableInputSpy.count, 2) + compare(control.displayText, "2") + compare(control.acceptableInput, true) + } } -- cgit v1.2.3