diff --git a/src/duckstation-qt/advancedsettingswidget.cpp b/src/duckstation-qt/advancedsettingswidget.cpp
index 4862b2fe1..40219cf56 100644
--- a/src/duckstation-qt/advancedsettingswidget.cpp
+++ b/src/duckstation-qt/advancedsettingswidget.cpp
@@ -1,6 +1,7 @@
 #include "advancedsettingswidget.h"
 #include "settingsdialog.h"
 #include "settingwidgetbinder.h"
+#include "mainwindow.h"
 
 AdvancedSettingsWidget::AdvancedSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog)
   : QWidget(parent), m_host_interface(host_interface)
@@ -27,9 +28,12 @@ AdvancedSettingsWidget::AdvancedSettingsWidget(QtHostInterface* host_interface,
   SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.cpuRecompilerMemoryExceptions, "CPU",
                                                "RecompilerMemoryExceptions", false);
 
+  SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.showDebugMenu, "Main", "ShowDebugMenu");
   SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.gpuUseDebugDevice, "GPU", "UseDebugDevice");
 
   connect(m_ui.resetToDefaultButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::onResetToDefaultClicked);
+  connect(m_ui.showDebugMenu, &QCheckBox::toggled, m_host_interface->getMainWindow(),
+          &MainWindow::updateDebugMenuVisibility, Qt::QueuedConnection);
 
   dialog->registerWidgetHelp(m_ui.gpuUseDebugDevice, tr("Use Debug Host GPU Device"), tr("Unchecked"),
                              tr("Enables the usage of debug devices and shaders for rendering APIs which support them. "
diff --git a/src/duckstation-qt/advancedsettingswidget.ui b/src/duckstation-qt/advancedsettingswidget.ui
index 897aedfc2..d1ba75000 100644
--- a/src/duckstation-qt/advancedsettingswidget.ui
+++ b/src/duckstation-qt/advancedsettingswidget.ui
@@ -207,7 +207,14 @@
       <string>System Settings</string>
      </property>
      <layout class="QFormLayout" name="formLayout">
-      <item row="0" column="0" colspan="2">
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="showDebugMenu">
+        <property name="text">
+         <string>Show Debug Menu</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
        <widget class="QCheckBox" name="gpuUseDebugDevice">
         <property name="text">
          <string>Use Debug Host GPU Device</string>
diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp
index f32f55cc8..9d853c696 100644
--- a/src/duckstation-qt/mainwindow.cpp
+++ b/src/duckstation-qt/mainwindow.cpp
@@ -451,6 +451,8 @@ void MainWindow::setupAdditionalUi()
   m_status_frame_time_widget->setFixedSize(190, 16);
   m_status_frame_time_widget->hide();
 
+  updateDebugMenuVisibility();
+
   for (u32 i = 0; i < static_cast<u32>(CPUExecutionMode::Count); i++)
   {
     const CPUExecutionMode mode = static_cast<CPUExecutionMode>(i);
@@ -847,6 +849,12 @@ void MainWindow::startupUpdateCheck()
   checkForUpdates(false);
 }
 
+void MainWindow::updateDebugMenuVisibility()
+{
+  const bool visible = m_host_interface->GetBoolSettingValue("Main", "ShowDebugMenu", false);
+  m_ui.menuDebug->menuAction()->setVisible(visible);
+}
+
 void MainWindow::checkForUpdates(bool display_message)
 {
   if (!AutoUpdaterDialog::isSupported())
diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h
index 0e1d0c2d7..f5c0308d3 100644
--- a/src/duckstation-qt/mainwindow.h
+++ b/src/duckstation-qt/mainwindow.h
@@ -29,6 +29,10 @@ public:
   /// Performs update check if enabled in settings.
   void startupUpdateCheck();
 
+public Q_SLOTS:
+  /// Updates debug menu visibility (hides if disabled).
+  void updateDebugMenuVisibility();
+
 private Q_SLOTS:
   void reportError(const QString& message);
   void reportMessage(const QString& message);