diff --git a/chrome/browser/printing/print_backend_service_manager.cc b/chrome/browser/printing/print_backend_service_manager.cc
index 8e75f8b83bc77..43dadbfdd3612 100644
--- a/chrome/browser/printing/print_backend_service_manager.cc
+++ b/chrome/browser/printing/print_backend_service_manager.cc
@@ -38,6 +38,7 @@
 
 #if BUILDFLAG(IS_LINUX)
 #include "content/public/common/content_switches.h"
+#include "ui/linux/linux_ui.h"
 #endif
 
 #if BUILDFLAG(IS_WIN)
@@ -878,14 +879,19 @@ PrintBackendServiceManager::GetServiceFromBundle(
             << (sandboxed ? "sandboxed" : "unsandboxed") << " for `"
             << remote_id << "`";
 
+    std::vector<std::string> extra_switches;
+#if BUILDFLAG(IS_LINUX)
+    if (auto* linux_ui = ui::LinuxUi::instance()) {
+      extra_switches = linux_ui->GetCmdLineFlagsForCopy();
+    }
+    extra_switches.push_back(switches::kMessageLoopTypeUi);
+#endif
     mojo::Remote<T>& host = bundle->host;
     content::ServiceProcessHost::Launch(
         host.BindNewPipeAndPassReceiver(),
         content::ServiceProcessHost::Options()
             .WithDisplayName(IDS_UTILITY_PROCESS_PRINT_BACKEND_SERVICE_NAME)
-#if BUILDFLAG(IS_LINUX)
-            .WithExtraCommandLineSwitches({switches::kMessageLoopTypeUi})
-#endif
+            .WithExtraCommandLineSwitches(std::move(extra_switches))
             .Pass());
     host->BindBackend(service.BindNewPipeAndPassReceiver());
 
diff --git a/ui/base/ui_base_switches.cc b/ui/base/ui_base_switches.cc
index 8c45e76112b8d..2aeb8892ad79e 100644
--- a/ui/base/ui_base_switches.cc
+++ b/ui/base/ui_base_switches.cc
@@ -33,6 +33,10 @@ const char kSystemFontFamily[] = "system-font-family";
 #if BUILDFLAG(IS_LINUX)
 // Specify the toolkit used to construct the Linux GUI.
 const char kUiToolkitFlag[] = "ui-toolkit";
+// Specify the GTK version to be loaded.
+const char kGtkVersionFlag[] = "gtk-version";
+// Specify the QT version to be loaded.
+const char kQtVersionFlag[] = "qt-version";
 // Disables GTK IME integration.
 const char kDisableGtkIme[] = "disable-gtk-ime";
 #endif
diff --git a/ui/base/ui_base_switches.h b/ui/base/ui_base_switches.h
index 3f4773fef66f2..581965da7fe3e 100644
--- a/ui/base/ui_base_switches.h
+++ b/ui/base/ui_base_switches.h
@@ -28,6 +28,8 @@ COMPONENT_EXPORT(UI_BASE) extern const char kSystemFontFamily[];
 
 #if BUILDFLAG(IS_LINUX)
 COMPONENT_EXPORT(UI_BASE) extern const char kUiToolkitFlag[];
+COMPONENT_EXPORT(UI_BASE) extern const char kGtkVersionFlag[];
+COMPONENT_EXPORT(UI_BASE) extern const char kQtVersionFlag[];
 COMPONENT_EXPORT(UI_BASE) extern const char kDisableGtkIme[];
 #endif
 
diff --git a/ui/gtk/gtk_compat.cc b/ui/gtk/gtk_compat.cc
index 946eb3eef6b0c..37bb48273cf48 100644
--- a/ui/gtk/gtk_compat.cc
+++ b/ui/gtk/gtk_compat.cc
@@ -15,6 +15,7 @@
 #include "base/nix/xdg_util.h"
 #include "base/no_destructor.h"
 #include "base/strings/string_number_conversions.h"
+#include "ui/base/ui_base_switches.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gtk/gtk_stubs.h"
 #include "ui/gtk/ime_compat_check.h"
@@ -26,8 +27,6 @@ namespace gtk {
 
 namespace {
 
-const char kGtkVersionFlag[] = "gtk-version";
-
 struct Gdk3Rgba {
   gdouble r;
   gdouble g;
@@ -136,7 +135,7 @@ bool LoadGtkImpl() {
 
   auto* cmd = base::CommandLine::ForCurrentProcess();
   unsigned int gtk_version;
-  if (!base::StringToUint(cmd->GetSwitchValueASCII(kGtkVersionFlag),
+  if (!base::StringToUint(cmd->GetSwitchValueASCII(switches::kGtkVersionFlag),
                           &gtk_version)) {
     gtk_version = 0;
   }
diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc
index 95bdbe6ae04af..79cdad0adc1ae 100644
--- a/ui/gtk/gtk_ui.cc
+++ b/ui/gtk/gtk_ui.cc
@@ -30,6 +30,7 @@
 #include "base/nix/xdg_util.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/observer_list.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "chrome/browser/themes/theme_properties.h"  // nogncheck
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -552,6 +553,15 @@ bool GtkUi::PreferDarkTheme() const {
   return dark;
 }
 
+std::vector<std::string> GtkUi::GetCmdLineFlagsForCopy() const {
+  const auto& gtk_version = GtkVersion();
+  uint32_t major_version =
+      gtk_version.IsValid() ? gtk_version.components()[0] : 0;
+  return {std::string(switches::kUiToolkitFlag) + "=gtk",
+          std::string(switches::kGtkVersionFlag) + "=" +
+              base::NumberToString(major_version)};
+}
+
 void GtkUi::SetDarkTheme(bool dark) {
   auto* settings = gtk_settings_get_default();
   g_object_set(settings, "gtk-application-prefer-dark-theme", dark, nullptr);
diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h
index 421b03ab1ce39..b1245f23b3383 100644
--- a/ui/gtk/gtk_ui.h
+++ b/ui/gtk/gtk_ui.h
@@ -94,6 +94,7 @@ class GtkUi : public ui::LinuxUiAndTheme {
       ui::WindowButtonOrderObserver* observer) override;
   WindowFrameAction GetWindowFrameAction(
       WindowFrameActionSource source) override;
+  std::vector<std::string> GetCmdLineFlagsForCopy() const override;
 
   // ui::LinuxUiTheme:
   ui::NativeTheme* GetNativeTheme() const override;
diff --git a/ui/linux/fake_linux_ui.cc b/ui/linux/fake_linux_ui.cc
index 00e2e3a896bbf..c12919e28ff48 100644
--- a/ui/linux/fake_linux_ui.cc
+++ b/ui/linux/fake_linux_ui.cc
@@ -89,6 +89,10 @@ LinuxUi::WindowFrameAction FakeLinuxUi::GetWindowFrameAction(
   return WindowFrameAction::kNone;
 }
 
+std::vector<std::string> FakeLinuxUi::GetCmdLineFlagsForCopy() const {
+  return {};
+}
+
 bool FakeLinuxUi::PreferDarkTheme() const {
   return false;
 }
diff --git a/ui/linux/fake_linux_ui.h b/ui/linux/fake_linux_ui.h
index 95922e9ba59f7..0d9fd7e7369dd 100644
--- a/ui/linux/fake_linux_ui.h
+++ b/ui/linux/fake_linux_ui.h
@@ -47,6 +47,7 @@ class FakeLinuxUi : public LinuxUiAndTheme {
       ui::WindowButtonOrderObserver* observer) override;
   WindowFrameAction GetWindowFrameAction(
       WindowFrameActionSource source) override;
+  std::vector<std::string> GetCmdLineFlagsForCopy() const override;
 
   // ui::LinuxUiTheme:
   ui::NativeTheme* GetNativeTheme() const override;
diff --git a/ui/linux/fallback_linux_ui.cc b/ui/linux/fallback_linux_ui.cc
index fb511d4999b00..91a1b1f63d30b 100644
--- a/ui/linux/fallback_linux_ui.cc
+++ b/ui/linux/fallback_linux_ui.cc
@@ -6,6 +6,7 @@
 
 #include "base/time/time.h"
 #include "ui/base/ime/linux/linux_input_method_context.h"
+#include "ui/base/ui_base_switches.h"
 #include "ui/events/keycodes/dom/dom_keyboard_layout_map.h"
 #include "ui/gfx/font_render_params.h"
 #include "ui/gfx/geometry/size.h"
@@ -116,6 +117,10 @@ LinuxUi::WindowFrameAction FallbackLinuxUi::GetWindowFrameAction(
   }
 }
 
+std::vector<std::string> FallbackLinuxUi::GetCmdLineFlagsForCopy() const {
+  return {std::string(switches::kUiToolkitFlag) + "=fallback"};
+}
+
 bool FallbackLinuxUi::PreferDarkTheme() const {
   return theme_is_dark_;
 }
diff --git a/ui/linux/fallback_linux_ui.h b/ui/linux/fallback_linux_ui.h
index d6bf9d35e4c31..47ff01e45326b 100644
--- a/ui/linux/fallback_linux_ui.h
+++ b/ui/linux/fallback_linux_ui.h
@@ -50,6 +50,7 @@ class FallbackLinuxUi : public LinuxUiAndTheme {
       ui::WindowButtonOrderObserver* observer) override;
   WindowFrameAction GetWindowFrameAction(
       WindowFrameActionSource source) override;
+  std::vector<std::string> GetCmdLineFlagsForCopy() const override;
 
   // ui::LinuxUiTheme:
   ui::NativeTheme* GetNativeTheme() const override;
diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h
index 4ce8218e5d809..c4805571bc162 100644
--- a/ui/linux/linux_ui.h
+++ b/ui/linux/linux_ui.h
@@ -205,6 +205,10 @@ class COMPONENT_EXPORT(LINUX_UI) LinuxUi {
   virtual WindowFrameAction GetWindowFrameAction(
       WindowFrameActionSource source) = 0;
 
+  // Returns the command line flags that should be copied to subprocesses
+  // to have the same toolkit and version as this process.
+  virtual std::vector<std::string> GetCmdLineFlagsForCopy() const = 0;
+
  protected:
   struct CmdLineArgs {
     CmdLineArgs();
diff --git a/ui/qt/qt_ui.cc b/ui/qt/qt_ui.cc
index 18b10a91a7587..30364f9cfc5bb 100644
--- a/ui/qt/qt_ui.cc
+++ b/ui/qt/qt_ui.cc
@@ -33,6 +33,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/ime/linux/linux_input_method_context.h"
 #include "ui/base/ime/text_edit_commands.h"
+#include "ui/base/ui_base_switches.h"
 #include "ui/color/color_mixer.h"
 #include "ui/color/color_provider.h"
 #include "ui/color/color_provider_manager.h"
@@ -61,16 +62,15 @@ namespace qt {
 
 namespace {
 
-const char kQtVersionFlag[] = "qt-version";
-
 void* LoadLibrary(const base::FilePath& path) {
   return dlopen(path.value().c_str(), RTLD_NOW | RTLD_GLOBAL);
 }
 
 bool PreferQt6() {
   auto* cmd = base::CommandLine::ForCurrentProcess();
-  if (cmd->HasSwitch(kQtVersionFlag)) {
-    std::string qt_version_string = cmd->GetSwitchValueASCII(kQtVersionFlag);
+  if (cmd->HasSwitch(switches::kQtVersionFlag)) {
+    std::string qt_version_string =
+        cmd->GetSwitchValueASCII(switches::kQtVersionFlag);
     unsigned int qt_version = 0;
     if (base::StringToUint(qt_version_string, &qt_version)) {
       switch (qt_version) {
@@ -395,6 +395,12 @@ QtUi::WindowFrameAction QtUi::GetWindowFrameAction(
   }
 }
 
+std::vector<std::string> QtUi::GetCmdLineFlagsForCopy() const {
+  return {std::string(switches::kUiToolkitFlag) + "=qt",
+          std::string(switches::kQtVersionFlag) + "=" +
+              base::NumberToString(qt_version_)};
+}
+
 DISABLE_CFI_VCALL
 bool QtUi::PreferDarkTheme() const {
   return color_utils::IsDark(
diff --git a/ui/qt/qt_ui.h b/ui/qt/qt_ui.h
index c0cfead8e67fb..a73906ecfe3a6 100644
--- a/ui/qt/qt_ui.h
+++ b/ui/qt/qt_ui.h
@@ -65,6 +65,7 @@ class QtUi : public ui::LinuxUiAndTheme, QtInterface::Delegate {
       ui::WindowButtonOrderObserver* observer) override;
   WindowFrameAction GetWindowFrameAction(
       WindowFrameActionSource source) override;
+  std::vector<std::string> GetCmdLineFlagsForCopy() const override;
 
   // ui::LinuxUiTheme:
   ui::NativeTheme* GetNativeTheme() const override;