diff --git a/src/duckstation-qt/gamelistmodel.cpp b/src/duckstation-qt/gamelistmodel.cpp
index 088a399cf..4f0a02638 100644
--- a/src/duckstation-qt/gamelistmodel.cpp
+++ b/src/duckstation-qt/gamelistmodel.cpp
@@ -4,6 +4,7 @@
 #include "core/system.h"
 #include <QtCore/QDate>
 #include <QtCore/QDateTime>
+#include <QtGui/QGuiApplication>
 #include <QtGui/QIcon>
 #include <QtGui/QPainter>
 
@@ -48,7 +49,9 @@ static void resizeAndPadPixmap(QPixmap* pm, int expected_width, int expected_hei
 
 static QPixmap createPlaceholderImage(int width, int height, float scale, const std::string& title)
 {
+  const float dpr = qApp->devicePixelRatio();
   QPixmap pm(QStringLiteral(":/icons/cover-placeholder.png"));
+  pm.setDevicePixelRatio(dpr);
   if (pm.isNull())
     return QPixmap(width, height);
 
@@ -61,7 +64,9 @@ static QPixmap createPlaceholderImage(int width, int height, float scale, const
     painter.setFont(font);
     painter.setPen(Qt::white);
 
-    painter.drawText(QRect(0, 0, width, height), Qt::AlignCenter | Qt::TextWordWrap, QString::fromStdString(title));
+    const QRect text_rc(0, 0, static_cast<int>(static_cast<float>(width) / dpr),
+                        static_cast<int>(static_cast<float>(height) / dpr));
+    painter.drawText(text_rc, Qt::AlignCenter | Qt::TextWordWrap, QString::fromStdString(title));
     painter.end();
   }
 
@@ -109,12 +114,12 @@ void GameListModel::refreshCovers()
 
 int GameListModel::getCoverArtWidth() const
 {
-  return std::max(static_cast<int>(static_cast<float>(COVER_ART_WIDTH) * m_cover_scale), 1);
+  return std::max(static_cast<int>(static_cast<float>(COVER_ART_WIDTH) * m_cover_scale * qApp->devicePixelRatio()), 1);
 }
 
 int GameListModel::getCoverArtHeight() const
 {
-  return std::max(static_cast<int>(static_cast<float>(COVER_ART_HEIGHT) * m_cover_scale), 1);
+  return std::max(static_cast<int>(static_cast<float>(COVER_ART_HEIGHT) * m_cover_scale * qApp->devicePixelRatio()), 1);
 }
 
 int GameListModel::getCoverArtSpacing() const
@@ -317,7 +322,10 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const
           {
             image = QPixmap(QString::fromStdString(path));
             if (!image.isNull())
+            {
+              image.setDevicePixelRatio(qApp->devicePixelRatio());
               resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight());
+            }
           }
 
           if (image.isNull())
@@ -441,8 +449,8 @@ bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& r
         return titlesLessThan(left_row, right_row, ascending);
 
       return ascending ? (left.total_size < right.total_size) : (right.total_size > left.total_size);
-    }  
-    
+    }
+
     case Column_Genre:
     {
       if (left.genre == right.genre)
@@ -450,14 +458,14 @@ bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& r
       return ascending ? (StringUtil::Strcasecmp(left.genre.c_str(), right.genre.c_str()) < 0) :
                          (StringUtil::Strcasecmp(right.genre.c_str(), left.genre.c_str()) > 0);
     }
-    
+
     case Column_Developer:
     {
       if (left.developer == right.developer)
         return titlesLessThan(left_row, right_row, ascending);
       return ascending ? (StringUtil::Strcasecmp(left.developer.c_str(), right.developer.c_str()) < 0) :
                          (StringUtil::Strcasecmp(right.developer.c_str(), left.developer.c_str()) > 0);
-    }   
+    }
 
     case Column_Publisher:
     {
@@ -473,17 +481,17 @@ bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& r
         return titlesLessThan(left_row, right_row, ascending);
 
       return ascending ? (left.release_date < right.release_date) : (right.release_date > left.release_date);
-    }   
+    }
 
     case Column_Players:
     {
-      u8 left_players = (left.min_players << 4 ) + left.max_players;
-      u8 right_players = (right.min_players << 4 ) + right.max_players;
+      u8 left_players = (left.min_players << 4) + left.max_players;
+      u8 right_players = (right.min_players << 4) + right.max_players;
       if (left_players == right_players)
         return titlesLessThan(left_row, right_row, ascending);
 
       return ascending ? (left_players < right_players) : (right_players > left_players);
-    }    
+    }
 
     default:
       return false;