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 testComboRequester_data(); private: bool createTestFile(const QString &fileName) { @@ -139,9 +142,63 @@ void KUrlRequesterTest::testComboRequester() { + QFETCH(bool, editable); + KUrlComboRequester req; + req.show(); + QList lineEdits = req.findChildren(); QVERIFY(lineEdits.isEmpty()); // no lineedits, only a readonly combo + + 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()); + if (editable) { + 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); + + QCOMPARE(returnSpy.size(), 0); + QCOMPARE(returnWithTextSpy.size(), 0); + QTest::keyEvent(QTest::Click, req.comboBox(), Qt::Key_Return); + QCOMPARE(returnSpy.size(), 1); + QCOMPARE(returnWithTextSpy.size(), 1); + QCOMPARE(returnWithTextSpy.last().first().toString(), text); + } else { + const auto url1 = QUrl("file:///foo/bar/1"); + const auto url2 = QUrl("file:///foo/bar/2"); + req.comboBox()->addUrl(url1); + QCOMPARE(textSpy.size(), 1); + QCOMPARE(textSpy.last().first().toUrl(), url1); + + req.comboBox()->addUrl(url2); + QCOMPARE(textSpy.size(), 1); + + QTest::keyEvent(QTest::Click, req.comboBox(), Qt::Key_Down); + QCOMPARE(textSpy.size(), 2); + QCOMPARE(textSpy.last().first().toUrl(), url2); + + // only editable combo boxes get the edit and return signals emitted + QCOMPARE(editSpy.size(), 0); + QCOMPARE(returnSpy.size(), 0); + QCOMPARE(returnWithTextSpy.size(), 0); + } +} + +void KUrlRequesterTest::testComboRequester_data() +{ + QTest::addColumn("editable"); + + QTest::newRow("read-only") << false; + QTest::newRow("editable") << true; } QTEST_MAIN(KUrlRequesterTest) diff --git a/src/widgets/kurlrequester.cpp b/src/widgets/kurlrequester.cpp --- a/src/widgets/kurlrequester.cpp +++ b/src/widgets/kurlrequester.cpp @@ -124,22 +124,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)); + } } }