diff --git a/autotests/kurlrequestertest.cpp b/autotests/kurlrequestertest.cpp --- a/autotests/kurlrequestertest.cpp +++ b/autotests/kurlrequestertest.cpp @@ -22,6 +22,8 @@ #include #include +#include + #include #include #include @@ -42,6 +44,7 @@ void initTestCase(); void testUrlRequester(); void testComboRequester(); + void testComboEditableRequester(); private: bool createTestFile(const QString &fileName) { @@ -144,5 +147,30 @@ QVERIFY(lineEdits.isEmpty()); // no lineedits, only a readonly combo } +void KUrlRequesterTest::testComboEditableRequester() +{ + KUrlComboRequester req; + + QSignalSpy textSpy(&req, &KUrlComboRequester::textChanged); + QSignalSpy editSpy(&req, &KUrlComboRequester::textEdited); + QSignalSpy returnSpy(&req, QOverload<>::of(&KUrlComboRequester::returnPressed)); + QSignalSpy returnWithTextSpy(&req, QOverload::of(&KUrlComboRequester::returnPressed)); + + QVERIFY(!req.comboBox()->isEditable()); + req.comboBox()->setEditable(true); + + const auto text = QStringLiteral("foobar"); + QTest::keyClicks(req.comboBox(), text, Qt::NoModifier); + QCOMPARE(textSpy.size(), text.size()); + QCOMPARE(editSpy.size(), text.size()); + QCOMPARE(textSpy.last().first().toString(), text); + QCOMPARE(editSpy.last().first().toString(), text); + + QTest::keyEvent(QTest::Click, req.comboBox(), Qt::Key_Return); + QCOMPARE(returnSpy.size(), 1); + QCOMPARE(returnWithTextSpy.size(), 1); + QCOMPARE(returnWithTextSpy.last().first().toString(), text); +} + QTEST_MAIN(KUrlRequesterTest) #include "kurlrequestertest.moc" diff --git a/src/widgets/kurlrequester.cpp b/src/widgets/kurlrequester.cpp --- a/src/widgets/kurlrequester.cpp +++ b/src/widgets/kurlrequester.cpp @@ -123,22 +123,29 @@ void connectSignals(KUrlRequester *receiver) { - QLineEdit *sender; if (combo) { - sender = combo->lineEdit(); - } else { - sender = edit; - } - if (sender) { - connect(sender, &QLineEdit::textChanged, + connect(combo, &QComboBox::currentTextChanged, receiver, &KUrlRequester::textChanged); - connect(sender, &QLineEdit::textEdited, + connect(combo, &QComboBox::editTextChanged, receiver, &KUrlRequester::textEdited); - connect(sender, SIGNAL(returnPressed()), - receiver, SIGNAL(returnPressed())); - connect(sender, SIGNAL(returnPressed(QString)), - receiver, SIGNAL(returnPressed(QString))); + connect(combo, QOverload<>::of(&KComboBox::returnPressed), + receiver, QOverload<>::of(&KUrlRequester::returnPressed)); + connect(combo, QOverload::of(&KComboBox::returnPressed), + receiver, QOverload<>::of(&KUrlRequester::returnPressed)); + } else if (edit) { + connect(edit, &QLineEdit::textChanged, + receiver, &KUrlRequester::textChanged); + connect(edit, &QLineEdit::textEdited, + receiver, &KUrlRequester::textEdited); + + connect(edit, QOverload<>::of(&QLineEdit::returnPressed), + receiver, QOverload<>::of(&KUrlRequester::returnPressed)); + + if (auto kline = qobject_cast(edit)) { + connect(kline, QOverload::of(&KLineEdit::returnPressed), + receiver, QOverload::of(&KUrlRequester::returnPressed)); + } } }