https://bugs.kde.org/show_bug.cgi?id=522948
https://codereview.qt-project.org/c/qt/qtbase/+/765860
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -270,5 +270,2 @@
     const QStringView myGroup = QStringView{mimeTypeName}.left(mimeTypeName.indexOf(u'/'));
-    // All text/* types are subclasses of text/plain.
-    if (myGroup == "text"_L1 && mimeTypeName != plainTextMimeType())
-        return plainTextMimeType();
     // All real-file mimetypes implicitly derive from application/octet-stream
@@ -297,2 +294,11 @@
         provider->addParents(mimeName, result);
+
+    // Implicit rule from the spec: all text/* types are subclasses of text/plain. It holds even
+    // for types that declare other parents, and shared-mime-info >= 2.5 relies on that rather
+    // than listing text/plain (e.g. text/x-shellscript only declares application/x-executable).
+    if (mimeName.startsWith("text/"_L1) && mimeName != plainTextMimeType()
+        && !result.contains(plainTextMimeType())) {
+        result.append(plainTextMimeType());
+    }
+
     if (result.isEmpty()) {
