diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp
index 66cf03292..d99980789 100644
--- a/src/duckstation-qt/mainwindow.cpp
+++ b/src/duckstation-qt/mainwindow.cpp
@@ -172,6 +172,7 @@ void MainWindow::initialize()
   m_ui.setupUi(this);
   setupAdditionalUi();
   updateToolbarActions();
+  updateToolbarIconStyle();
   updateEmulationActions(false, false, false);
   connectSignals();
 
@@ -1308,11 +1309,48 @@ void MainWindow::onViewToolbarActionToggled(bool checked)
   m_ui.toolBar->setVisible(checked);
 }
 
-void MainWindow::onViewLockToolbarActionToggled(bool checked)
+void MainWindow::onViewToolbarLockActionToggled(bool checked)
 {
-  Host::SetBaseBoolSettingValue("UI", "LockToolbar", checked);
+  Host::SetBaseBoolSettingValue("UI", "LockToolbar", !checked);
   Host::CommitBaseSettingChanges();
   m_ui.toolBar->setMovable(!checked);
+
+  // ensure synced
+  const QSignalBlocker sb(m_ui.actionViewLockToolbar);
+  m_ui.actionViewLockToolbar->setChecked(checked);
+}
+
+void MainWindow::onViewToolbarSmallIconsActionToggled(bool checked)
+{
+  Host::SetBaseBoolSettingValue("UI", "ToolbarSmallIcons", checked);
+  Host::CommitBaseSettingChanges();
+  updateToolbarIconStyle();
+
+  // ensure synced
+  const QSignalBlocker sb(m_ui.actionViewSmallToolbarIcons);
+  m_ui.actionViewSmallToolbarIcons->setChecked(checked);
+}
+
+void MainWindow::onViewToolbarLabelsActionToggled(bool checked)
+{
+  Host::SetBaseBoolSettingValue("UI", "ToolbarLabels", checked);
+  Host::CommitBaseSettingChanges();
+  updateToolbarIconStyle();
+
+  // ensure synced
+  const QSignalBlocker sb(m_ui.actionViewToolbarLabels);
+  m_ui.actionViewToolbarLabels->setChecked(checked);
+}
+
+void MainWindow::onViewToolbarLabelsBesideIconsActionToggled(bool checked)
+{
+  Host::SetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", checked);
+  Host::CommitBaseSettingChanges();
+  updateToolbarIconStyle();
+
+  // ensure synced
+  const QSignalBlocker sb(m_ui.actionViewToolbarLabelsBesidesText);
+  m_ui.actionViewToolbarLabelsBesidesText->setChecked(checked);
 }
 
 void MainWindow::onViewStatusBarActionToggled(bool checked)
@@ -1672,6 +1710,11 @@ void MainWindow::setupAdditionalUi()
   m_ui.actionViewLockToolbar->setChecked(toolbars_locked);
   m_ui.toolBar->setMovable(!toolbars_locked);
 
+  m_ui.actionViewSmallToolbarIcons->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarSmallIcons", false));
+  m_ui.actionViewToolbarLabels->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarLabels", true));
+  m_ui.actionViewToolbarLabelsBesidesText->setChecked(
+    Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false));
+
   m_game_list_widget = new GameListWidget(m_ui.mainContainer);
   m_game_list_widget->initialize();
   m_ui.mainContainer->addWidget(m_game_list_widget);
@@ -1768,6 +1811,27 @@ void MainWindow::updateToolbarActions()
   }
 }
 
+void MainWindow::updateToolbarIconStyle()
+{
+  const bool show_labels = Host::GetBaseBoolSettingValue("UI", "ToolbarLabels", true);
+  const bool small_icons = Host::GetBaseBoolSettingValue("UI", "ToolbarSmallIcons", false);
+  const bool labels_beside_icons = Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false);
+
+  Qt::ToolButtonStyle style;
+  if (!show_labels)
+    style = Qt::ToolButtonIconOnly;
+  else if (labels_beside_icons)
+    style = Qt::ToolButtonTextBesideIcon;
+  else
+    style = Qt::ToolButtonTextUnderIcon;
+  if (m_ui.toolBar->toolButtonStyle() != style)
+    m_ui.toolBar->setToolButtonStyle(style);
+
+  const QSize icon_size = QSize(small_icons ? 16 : 32, small_icons ? 16 : 32);
+  if (m_ui.toolBar->iconSize() != icon_size)
+    m_ui.toolBar->setIconSize(icon_size);
+}
+
 void MainWindow::onToolbarContextMenuRequested(const QPoint& pos)
 {
   {
@@ -1778,6 +1842,28 @@ void MainWindow::onToolbarContextMenuRequested(const QPoint& pos)
 
     QMenu menu;
 
+    QAction* action = menu.addAction(tr("Lock Toolbar"));
+    action->setCheckable(true);
+    action->setChecked(m_ui.toolBar->isMovable());
+    connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarLockActionToggled);
+
+    action = menu.addAction(tr("Small Icons"));
+    action->setCheckable(true);
+    action->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarSmallIcons", false));
+    connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarSmallIconsActionToggled);
+
+    action = menu.addAction(tr("Show Labels"));
+    action->setCheckable(true);
+    action->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarLabels", true));
+    connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarLabelsActionToggled);
+
+    action = menu.addAction(tr("Labels Beside Icons"));
+    action->setCheckable(true);
+    action->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false));
+    connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarLabelsBesideIconsActionToggled);
+
+    menu.addSeparator();
+
     for (const auto& [name, action_ptr] : s_toolbar_actions)
     {
       if (!name)
@@ -1786,8 +1872,7 @@ void MainWindow::onToolbarContextMenuRequested(const QPoint& pos)
         continue;
       }
 
-      QAction* action = (m_ui.*action_ptr);
-      QAction* menu_action = menu.addAction(action->text());
+      QAction* menu_action = menu.addAction((m_ui.*action_ptr)->text());
       menu_action->setCheckable(true);
       menu_action->setChecked(StringUtil::IsInStringList(active_buttons, name));
       connect(menu_action, &QAction::toggled, this, [&active_buttons, &active_buttons_changed, name](bool checked) {
@@ -1801,11 +1886,11 @@ void MainWindow::onToolbarContextMenuRequested(const QPoint& pos)
 
     menu.exec(m_ui.toolBar->mapToGlobal(pos));
 
-    if (!active_buttons_changed)
-      return;
-
-    Host::SetBaseStringSettingValue("UI", "ToolbarButtons", StringUtil::JoinString(active_buttons, ',').c_str());
-    Host::CommitBaseSettingChanges();
+    if (active_buttons_changed)
+    {
+      Host::SetBaseStringSettingValue("UI", "ToolbarButtons", StringUtil::JoinString(active_buttons, ',').c_str());
+      Host::CommitBaseSettingChanges();
+    }
   }
 
   updateToolbarActions();
@@ -2107,7 +2192,11 @@ void MainWindow::connectSignals()
   connect(m_ui.actionAdvancedSettings, &QAction::triggered, [this]() { doSettings("Advanced"); });
   connect(m_ui.actionControllerProfiles, &QAction::triggered, this, &MainWindow::onSettingsControllerProfilesTriggered);
   connect(m_ui.actionViewToolbar, &QAction::toggled, this, &MainWindow::onViewToolbarActionToggled);
-  connect(m_ui.actionViewLockToolbar, &QAction::toggled, this, &MainWindow::onViewLockToolbarActionToggled);
+  connect(m_ui.actionViewLockToolbar, &QAction::toggled, this, &MainWindow::onViewToolbarLockActionToggled);
+  connect(m_ui.actionViewSmallToolbarIcons, &QAction::toggled, this, &MainWindow::onViewToolbarSmallIconsActionToggled);
+  connect(m_ui.actionViewToolbarLabels, &QAction::toggled, this, &MainWindow::onViewToolbarLabelsActionToggled);
+  connect(m_ui.actionViewToolbarLabelsBesidesText, &QAction::toggled, this,
+          &MainWindow::onViewToolbarLabelsBesideIconsActionToggled);
   connect(m_ui.actionViewStatusBar, &QAction::toggled, this, &MainWindow::onViewStatusBarActionToggled);
   connect(m_ui.actionViewGameList, &QAction::triggered, this, &MainWindow::onViewGameListActionTriggered);
   connect(m_ui.actionViewGameGrid, &QAction::triggered, this, &MainWindow::onViewGameGridActionTriggered);
diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h
index c300f4267..c60ecc7a6 100644
--- a/src/duckstation-qt/mainwindow.h
+++ b/src/duckstation-qt/mainwindow.h
@@ -182,7 +182,10 @@ private Q_SLOTS:
   void onRemoveDiscActionTriggered();
   void onScanForNewGamesTriggered();
   void onViewToolbarActionToggled(bool checked);
-  void onViewLockToolbarActionToggled(bool checked);
+  void onViewToolbarLockActionToggled(bool checked);
+  void onViewToolbarSmallIconsActionToggled(bool checked);
+  void onViewToolbarLabelsActionToggled(bool checked);
+  void onViewToolbarLabelsBesideIconsActionToggled(bool checked);
   void onViewStatusBarActionToggled(bool checked);
   void onViewGameListActionTriggered();
   void onViewGameGridActionTriggered();
@@ -238,6 +241,7 @@ private:
   void connectSignals();
 
   void updateToolbarActions();
+  void updateToolbarIconStyle();
   void updateEmulationActions(bool starting, bool running, bool cheevos_challenge_mode);
   void updateShortcutActions(bool starting);
   void updateStatusBarWidgetVisibility();
diff --git a/src/duckstation-qt/mainwindow.ui b/src/duckstation-qt/mainwindow.ui
index 422657d8e..2cb789bc2 100644
--- a/src/duckstation-qt/mainwindow.ui
+++ b/src/duckstation-qt/mainwindow.ui
@@ -198,6 +198,9 @@
     
     
     
+    
+    
+    
     
     
     
@@ -746,6 +749,30 @@
     Lock Toolbar
    
   
+  
+   
+    true
+   
+   
+    Small Toolbar Icons
+   
+  
+  
+   
+    true
+   
+   
+    Toolbar Labels
+   
+  
+  
+   
+    true
+   
+   
+    Toolbar Labels Besides Text
+   
+  
   
    
     true