diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 527a842d170ca86bb5d2d65280988acc5cddce69..d4d2d527d44a724d0e11d642541967ebdf97c36f 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -4288,9 +4288,13 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
     }
     int signal_index = -1;
     void *args[] = { &signal_index, signal };
-    senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args);
-    if (signal_index < 0 || signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount) {
-        qWarning("QObject::connect: signal not found in %s", senderMetaObject->className());
+    for (; senderMetaObject && signal_index < 0; senderMetaObject = senderMetaObject->superClass()) {
+        senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args);
+        if (signal_index >= 0 && signal_index < QMetaObjectPrivate::get(senderMetaObject)->signalCount)
+            break;
+    }
+    if (!senderMetaObject) {
+        qWarning("QObject::connect: signal not found in %s", sender->metaObject()->className());
         slotObj->destroyIfLastRef();
         return QMetaObject::Connection(0);
     }
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 06fc89f657fd5f841684a6441dc007fccdcc1596..d16369de0257ec8436d27f3b4273489d42fa4419 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -145,6 +145,7 @@ private slots:
     void connectFunctorArgDifference();
     void connectFunctorOverloads();
     void disconnectDoesNotLeakFunctor();
+    void connectBase();
 };
 
 struct QObjectCreatedOnShutdown
@@ -5811,5 +5812,29 @@ void tst_QObject::disconnectDoesNotLeakFunctor()
     QCOMPARE(countedStructObjectsCount, 0);
 }
 
+class SubSender : public SenderObject {
+    Q_OBJECT
+};
+
+void tst_QObject::connectBase()
+{
+    SubSender sub;
+    ReceiverObject r1;
+    r1.reset();
+
+    QVERIFY( connect( &sub, &SubSender::signal1 , &r1, &ReceiverObject::slot1 ) );
+    QVERIFY( connect( &sub, static_cast<void (SenderObject::*)()>(&SubSender::signal2) , &r1, &ReceiverObject::slot2 ) );
+    QVERIFY( connect( &sub, static_cast<void (SubSender::*)()>(&SubSender::signal3) , &r1, &ReceiverObject::slot3 ) );
+
+    sub.emitSignal1();
+    sub.emitSignal2();
+    sub.emitSignal3();
+
+    QCOMPARE( r1.count_slot1, 1 );
+    QCOMPARE( r1.count_slot2, 1 );
+    QCOMPARE( r1.count_slot3, 1 );
+}
+
+
 QTEST_MAIN(tst_QObject)
 #include "tst_qobject.moc"