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,23 @@ 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, static_cast(&KUrlComboRequester::returnPressed)); + QSignalSpy returnWithTextSpy(&req, static_cast(&KUrlComboRequester::returnPressed)); + + QVERIFY(!req.comboBox()->isEditable()); + req.comboBox()->setEditable(true); + + // FIXME: this still doesn't emit any signal, but it works in practice when actually interacting with the widget? + req.comboBox()->setEditText("foobar"); + QVERIFY(editSpy.wait()); + QCOMPARE(editSpy.first().first().toString(), QStringLiteral("foobar")); +} + 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, static_cast(&KComboBox::returnPressed), + receiver, static_cast(&KUrlRequester::returnPressed)); + connect(combo, static_cast(&KComboBox::returnPressed), + receiver, static_cast(&KUrlRequester::returnPressed)); + } else if (edit) { + connect(edit, &QLineEdit::textChanged, + receiver, &KUrlRequester::textChanged); + connect(edit, &QLineEdit::textEdited, + receiver, &KUrlRequester::textEdited); + + connect(edit, static_cast(&QLineEdit::returnPressed), + receiver, static_cast(&KUrlRequester::returnPressed)); + + if (auto kline = qobject_cast(edit)) { + connect(kline, static_cast(&KLineEdit::returnPressed), + receiver, static_cast(&KUrlRequester::returnPressed)); + } } }