diff --git a/src/plugins/platforms/cocoa/qcocoaapplication.mm b/src/plugins/platforms/cocoa/qcocoaapplication.mm
index c496134..64040b1 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplication.mm
+++ b/src/plugins/platforms/cocoa/qcocoaapplication.mm
@@ -137,7 +137,6 @@ - (BOOL)QT_MANGLE_NAMESPACE(qt_filterEvent):(NSEvent *)event
     if (qApp && qApp->eventDispatcher()->
             filterNativeEvent(q_macLocalEventType, static_cast<void*>(event), 0))
         return true;
-
     if ([event type] == NSApplicationDefined) {
         switch (static_cast<short>([event subtype])) {
             case QtCocoaEventSubTypePostMessage:
diff --git a/src/plugins/platforms/cocoa/qcocoainputcontext.h b/src/plugins/platforms/cocoa/qcocoainputcontext.h
index a248ca0..f947620 100644
--- a/src/plugins/platforms/cocoa/qcocoainputcontext.h
+++ b/src/plugins/platforms/cocoa/qcocoainputcontext.h
@@ -56,6 +56,7 @@ public:
     bool isValid() const Q_DECL_OVERRIDE { return true; }
 
     void reset() Q_DECL_OVERRIDE;
+    bool filterEvent(const QEvent *event) Q_DECL_OVERRIDE;
 
     QLocale locale() const Q_DECL_OVERRIDE { return m_locale; }
     void updateLocale();
diff --git a/src/plugins/platforms/cocoa/qcocoainputcontext.mm b/src/plugins/platforms/cocoa/qcocoainputcontext.mm
index 04d6d6b..f26c1f3 100644
--- a/src/plugins/platforms/cocoa/qcocoainputcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoainputcontext.mm
@@ -113,6 +113,21 @@ Handles input of foreign characters (particularly East Asian)
     }
 }
 
+bool QCocoaInputContext::filterEvent(const QEvent *event)
+{
+    if (event->type() == QEvent::KeyPress) {
+        //TODO thats hard because while we pretent to operate on the passed QEvent *event
+        //we actually only forward the current event unlike XCB and Windows qpa's... That
+        //works in the case of QAbstractItemViewPrivate::openEditor only because the
+        //passed on event is the currentEvent but would give surprised otherwise. So, fix
+        //that using CGEventCreateKeyboardEvent+CGEventPost or something that works.
+        NSEvent *currentEvent = [NSApp currentEvent];
+        [NSApp sendEvent:currentEvent];
+        return true;
+    }
+    return false;
+}
+
 void QCocoaInputContext::connectSignals()
 {
     connect(qApp, SIGNAL(focusObjectChanged(QObject*)), this, SLOT(focusObjectChanged(QObject*)));
diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
index 501b956..de1396d 100644
--- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
@@ -343,6 +343,34 @@ static inline QString getCompositionString(HIMC himc, DWORD dwIndex)
     return QString::fromWCharArray(buffer,  size_t(length) / sizeof(wchar_t));
 }
 
+bool QWindowsInputContext::filterEvent(const QEvent *event)
+{
+    if (event->type() == QEvent::KeyPress) {
+        QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(QGuiApplication::focusWindow());
+
+        //TODO needs probably more conditions like focusObjectChanged, maybe also QInputEvent.timestamp, ...
+        if (!m_compositionContext.isComposing && platformWindow && !platformWindow->testFlag(QWindowsWindow::InputMethodDisabled)) {
+            const QKeyEvent *ke = static_cast<const QKeyEvent*>(event);
+            QVarLengthArray<INPUT> inputs;
+            KEYBDINPUT ki;
+            ki.wVk = ke->nativeVirtualKey();
+            ki.time = 0;
+            ki.dwFlags = 0;
+            ki.dwExtraInfo = 0;
+            ki.wScan = ke->text().isEmpty() ? 0 : QChar(ke->text()[0]).unicode();
+            ki.dwFlags = KEYEVENTF_UNICODE;
+            INPUT input;
+            input.type = INPUT_KEYBOARD;
+            input.ki = ki;
+            inputs.append(input);
+            SendInput(inputs.count(), inputs.data(), sizeof(INPUT));
+            return true;
+        }
+    }
+
+    return false;
+}
+
 // Determine the converted string range as pair of start/length to be selected.
 static inline void getCompositionStringConvertedRange(HIMC himc, int *selStart, int *selLength)
 {
diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.h b/src/plugins/platforms/windows/qwindowsinputcontext.h
index 4c08fa0..15db0e9 100644
--- a/src/plugins/platforms/windows/qwindowsinputcontext.h
+++ b/src/plugins/platforms/windows/qwindowsinputcontext.h
@@ -79,6 +79,7 @@ public:
     void reset() Q_DECL_OVERRIDE;
     void update(Qt::InputMethodQueries) Q_DECL_OVERRIDE;
     void invokeAction(QInputMethod::Action, int cursorPosition) Q_DECL_OVERRIDE;
+    bool filterEvent(const QEvent *event) Q_DECL_OVERRIDE;
     void setFocusObject(QObject *object) Q_DECL_OVERRIDE;
 
     bool startComposition(HWND hwnd);
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index 24be27a..e65f25f 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -61,6 +61,8 @@
 #include <private/qabstractitemmodel_p.h>
 #include <private/qguiapplication_p.h>
 #include <private/qscrollbar_p.h>
+#include <qpa/qplatforminputcontext.h>
+#include <qpa/qplatformintegration.h>
 #ifndef QT_NO_ACCESSIBILITY
 #include <qaccessible.h>
 #endif
@@ -4394,8 +4396,14 @@ bool QAbstractItemViewPrivate::openEditor(const QModelIndex &index, QEvent *even
     w->show();
     w->setFocus();
 
-    if (event)
+    if (event) {
+        //TODO make more generic, e.g. move that to QGuiApplicationPrivate::processKeyEvent
+        QPlatformInputContext *inputContext = QGuiApplicationPrivate::platformIntegration()->inputContext();
+        if (inputContext && inputContext->filterEvent(event)) {
+            return true;
+        }
         QApplication::sendEvent(w->focusProxy() ? w->focusProxy() : w, event);
+    }
 
     return true;
 }
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 98cc9b2..ec43fc0 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -34,6 +34,7 @@
 #include <qlistview.h>
 #include <private/qlistview_p.h>
 #include <private/qcoreapplication_p.h>
+#include <private/qguiapplication_p.h>
 #include <qlistwidget.h>
 #include <qitemdelegate.h>
 #include <qstandarditemmodel.h>
@@ -45,6 +46,8 @@
 #include <QtWidgets/QStyledItemDelegate>
 #include <QtWidgets/QStyleFactory>
 #include <QtWidgets/QVBoxLayout>
+#include <qpa/qplatforminputcontext.h>
+#include <qpa/qplatformintegration.h>
 
 #if defined(Q_OS_WIN) || defined(Q_OS_WINCE)
 #  include <windows.h>
@@ -151,6 +154,7 @@ private slots:
     void horizontalScrollingByVerticalWheelEvents();
     void taskQTBUG_7232_AllowUserToControlSingleStep();
     void taskQTBUG_51086_skippingIndexesInSelectedIndexes();
+    void taskQTBUG_54848_multicharIME();
 };
 
 // Testing get/set functions
@@ -2524,5 +2528,72 @@ void tst_QListView::taskQTBUG_51086_skippingIndexesInSelectedIndexes()
     QVERIFY(!indexes.contains(data.index(8, 0)));
 }
 
+void tst_QListView::taskQTBUG_54848_multicharIME()
+{
+    QStandardItemModel data(2, 2);
+    QListView view;
+    view.setModel(&data);
+    view.setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::AnyKeyPressed | QAbstractItemView::SelectedClicked);
+    view.setCurrentIndex(data.index(0, 0));
+    view.show();
+
+    // Verify that sending a character to the QAbstractItemView, so the EditTrigger is triggered, does
+    // forward the event to the editor-widget through the QPlatformInputContext::filterEvent.
+    class PlatformInputContext : public QPlatformInputContext
+    {
+    public:
+        QPlatformInputContext *c;
+        int filterEventCount;
+        explicit PlatformInputContext(QPlatformInputContext *c) : QPlatformInputContext(), c(c), filterEventCount(0) {}
+        virtual bool isValid() const { return c->isValid(); }
+        virtual bool hasCapability(Capability capability) const { return c->hasCapability(capability); }
+        virtual void reset() { c->reset(); }
+        virtual void commit() { c->commit(); }
+        virtual void update(Qt::InputMethodQueries q) { c->update(q); }
+        virtual void invokeAction(QInputMethod::Action a, int p) { c->invokeAction(a, p); }
+        virtual bool filterEvent(const QEvent *e) {
+            ++filterEventCount;
+            return c->filterEvent(e);
+        }
+        virtual QRectF keyboardRect() const { return c->keyboardRect(); }
+        virtual bool isAnimating() const { return c->isAnimating(); }
+        virtual void showInputPanel() { c->showInputPanel(); }
+        virtual void hideInputPanel() { c->hideInputPanel(); }
+        virtual bool isInputPanelVisible() const { return c->isInputPanelVisible(); }
+        virtual QLocale locale() const { return c->locale(); }
+        virtual Qt::LayoutDirection inputDirection() const { return c->inputDirection(); }
+        virtual void setFocusObject(QObject *o) { c->setFocusObject(o); }
+    };
+
+    class PlatformIntegration : public QPlatformIntegration
+    {
+    public:
+        QPlatformIntegration *pi;
+        PlatformInputContext *ic;
+        explicit PlatformIntegration() : QPlatformIntegration() {
+            pi = QGuiApplicationPrivate::platform_integration;
+            ic = new PlatformInputContext(pi->inputContext());
+            QGuiApplicationPrivate::platform_integration = this;
+        }
+        virtual ~PlatformIntegration() {
+            QGuiApplicationPrivate::platform_integration = pi;
+            delete ic;
+        }
+        virtual QPlatformWindow *createPlatformWindow(QWindow *w) const { return pi->createPlatformWindow(w); }
+        virtual QPlatformBackingStore *createPlatformBackingStore(QWindow *w) const { return pi->createPlatformBackingStore(w); }
+        virtual QAbstractEventDispatcher *createEventDispatcher() const { return pi->createEventDispatcher(); }
+        virtual QPlatformInputContext *inputContext() const { return ic; }
+    };
+
+    int filterEventCount = 0;
+    {
+        PlatformIntegration pi;
+        QKeyEvent e(QEvent::KeyPress, Qt::Key_C, Qt::NoModifier, "c");
+        QApplication::sendEvent(&view, &e);
+        filterEventCount = pi.ic->filterEventCount;
+    }
+    QVERIFY2(filterEventCount > 0, "PlatformInputContext::filterEvent was not called");
+}
+
 QTEST_MAIN(tst_QListView)
 #include "tst_qlistview.moc"
