QComboBox: Update completer on setCurrentIndex()

When the ComboBox currentText() was changed by key
LineUp or LineDown or mouse click, the completer still
contained the last inserted characters.

If now all text was selected (by Ctrl+A or selectAll()),
the old item and index was restored on next Enter press.

Task-number: QTBUG-41288
Change-Id: I6916fd31c8b8fbacfb12e1a62c3e46823cf918b4
Reviewed-by: Timur Pocheptsov <Timur.Pocheptsov@digia.com>
This commit is contained in:
Andre Hartmann 2014-12-29 10:35:09 +01:00 committed by André Hartmann
parent f64b87a5df
commit e610ef8c8d
2 changed files with 43 additions and 1 deletions

View File

@ -2074,8 +2074,11 @@ void QComboBoxPrivate::setCurrentIndex(const QModelIndex &mi)
currentIndex = QPersistentModelIndex(normalized);
if (lineEdit) {
const QString newText = itemText(normalized);
if (lineEdit->text() != newText)
if (lineEdit->text() != newText) {
lineEdit->setText(newText);
if (lineEdit->completer())
lineEdit->completer()->setCompletionPrefix(newText);
}
updateLineEditGeometry();
}
if (indexChanged) {

View File

@ -158,6 +158,7 @@ private slots:
void highlightedSignal();
void itemData();
void task_QTBUG_31146_popupCompletion();
void task_QTBUG_41288_completerChangesCurrentIndex();
void keyboardSelection();
void setCustomModelAndView();
void updateDelegateOnEditableChange();
@ -3026,6 +3027,44 @@ void tst_QComboBox::task_QTBUG_31146_popupCompletion()
QCOMPARE(comboBox.currentIndex(), 0);
}
void tst_QComboBox::task_QTBUG_41288_completerChangesCurrentIndex()
{
QComboBox comboBox;
comboBox.setEditable(true);
comboBox.addItems(QStringList() << QStringLiteral("111") << QStringLiteral("222"));
comboBox.show();
comboBox.activateWindow();
QVERIFY(QTest::qWaitForWindowActive(&comboBox));
{
// change currentIndex() by keyboard
comboBox.lineEdit()->selectAll();
QTest::keyClicks(comboBox.lineEdit(), "222");
QTest::keyClick(comboBox.lineEdit(), Qt::Key_Enter);
QCOMPARE(comboBox.currentIndex(), 1);
QTest::keyClick(&comboBox, Qt::Key_Up);
comboBox.lineEdit()->selectAll();
QTest::keyClick(comboBox.lineEdit(), Qt::Key_Enter);
QCOMPARE(comboBox.currentIndex(), 0);
}
{
// change currentIndex() programmatically
comboBox.lineEdit()->selectAll();
QTest::keyClicks(comboBox.lineEdit(), "222");
QTest::keyClick(comboBox.lineEdit(), Qt::Key_Enter);
QCOMPARE(comboBox.currentIndex(), 1);
comboBox.setCurrentIndex(0);
comboBox.lineEdit()->selectAll();
QTest::keyClick(comboBox.lineEdit(), Qt::Key_Enter);
QCOMPARE(comboBox.currentIndex(), 0);
}
}
void tst_QComboBox::keyboardSelection()
{
QComboBox comboBox;