diff --git a/src/duckstation-qt/settingswindow.cpp b/src/duckstation-qt/settingswindow.cpp
index 687bd413a..4b71035ec 100644
--- a/src/duckstation-qt/settingswindow.cpp
+++ b/src/duckstation-qt/settingswindow.cpp
@@ -68,6 +68,13 @@ SettingsWindow::~SettingsWindow()
     s_open_game_properties_dialogs.removeOne(this);
 }
 
+void SettingsWindow::closeEvent(QCloseEvent* event)
+{
+  // we need to clean up ourselves, since we're not modal
+  if (isPerGameSettings())
+    deleteLater();
+}
+
 void SettingsWindow::addPages()
 {
   addWidget(
diff --git a/src/duckstation-qt/settingswindow.h b/src/duckstation-qt/settingswindow.h
index e4d24f5ff..8cb0fa6db 100644
--- a/src/duckstation-qt/settingswindow.h
+++ b/src/duckstation-qt/settingswindow.h
@@ -98,7 +98,8 @@ private Q_SLOTS:
   void onRestoreDefaultsClicked();
 
 protected:
-  void wheelEvent(QWheelEvent* event);
+  void closeEvent(QCloseEvent* event) override;
+  void wheelEvent(QWheelEvent* event) override;
 
 private:
   enum : u32