diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 42560a7578..1e72f362c0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -213,12 +213,6 @@ jobs:
args: ./b.sh --libretro_android ppsspp_libretro
id: android-libretro
- - os: ubuntu-26.04
- extra: qt
- cc: gcc
- cxx: g++
- args: ./b.sh --qt
- id: qt
- os: ubuntu-26.04
extra: libretro
cc: gcc
@@ -270,14 +264,6 @@ jobs:
run: |
git fetch --deepen=15000 --no-recurse-submodules --tags || exit 0
- - name: Install Qt
- uses: jurplel/install-qt-action@48d3ad6db93f3627c8ee7a0454bc6f3744f7e730 # v4.3.1
- if: matrix.extra == 'qt'
- with:
- cache: true
- version: 5.15.2
- setup-python: false
-
- name: Setup Android NDK
uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
if: matrix.extra == 'android'
diff --git a/.gitignore b/.gitignore
index dac6b5062a..89b166c2e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,9 +60,6 @@ ppsspp.ini
imgui.ini
PPSSPPControls.dat
-# Qt Linguist files
-*.qm
-
# Gradle/Android Studio
.gradle
.idea
diff --git a/AGENTS.md b/AGENTS.md
index 4a5bc27ab5..510478deaf 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -55,7 +55,6 @@ Windows/main.cpp
ios/main.cpp
SDL/SDLMain.cpp
UWP/PPSSPP_UWPMain.cpp
-Qt/main.cpp
android/jni/app-android.cpp
libretro/libretro.cpp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b9dfd4f445..5311b8d70e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -182,7 +182,6 @@ option(USING_X11_VULKAN "Set to OFF if target environment doesn't use X11 for Vu
option(USE_WAYLAND_WSI "Enable or disable Wayland WSI support for Vulkan" ON)
option(USE_VULKAN_DISPLAY_KHR "Enable or disable full screen display of Vulkan" ${USE_VULKAN_DISPLAY_KHR})
# :: Frontends
-option(USING_QT_UI "Set to ON if you wish to use the Qt frontend wrapper" ${USING_QT_UI})
option(MOBILE_DEVICE "Set to ON when targeting a mobile device" ${MOBILE_DEVICE})
option(HEADLESS "Set to OFF to not generate the PPSSPPHeadless target" ${HEADLESS})
option(ATLAS_TOOL "Set to OFF to not generate the ATLAS_TOOL target" ${ATLAS_TOOL})
@@ -986,49 +985,6 @@ elseif(IOS AND NOT LIBRETRO)
set(TargetBin PPSSPP)
elseif(IOS AND LIBRETRO)
list(APPEND targetExtraLibs "-framework GLKit")
-elseif(USING_QT_UI)
- set(CMAKE_AUTOMOC ON)
- find_package(Qt5 COMPONENTS OpenGL Gui Core Multimedia)
- if(NOT Qt5_FOUND)
- message(FATAL_ERROR "Qt5 not found for USING_QT_UI=ON. On linux, sudo apt install qt5-qmake qtsystems5-dev qtmultimedia5-dev qttools5-dev-tools libqt5opengl5-dev libcurl4-openssl-dev. On macOS with Homebrew, install qt@5 and set CMAKE_PREFIX_PATH to /opt/homebrew/opt/qt@5 (or use ./b.sh --qtbrew).")
- endif()
- list(APPEND NativeAppSource
- Qt/QtMain.cpp
- Qt/QtMain.h
- Qt/mainwindow.cpp
- Qt/mainwindow.h
- )
- add_compile_definitions(USING_QT_UI)
- if(USING_GLES2)
- add_compile_definitions(QT_OPENGL_ES QT_OPENGL_ES_2)
- endif()
- if(APPLE)
- list(APPEND NativeAppSource
- Common/Battery/AppleBatteryClient.m)
- set_source_files_properties(Common/Battery/AppleBatteryClient.m
- Common/Render/Text/draw_text_cocoa.mm
- PROPERTIES COMPILE_FLAGS -fobjc-arc)
- list(APPEND targetExtraLibs ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY})
- endif()
- include_directories(Qt)
- include_directories(${CMAKE_CURRENT_BINARY_DIR})
- list(APPEND targetExtraLibs Qt5::OpenGL Qt5::Gui Qt5::Core Qt5::Multimedia)
- set(TargetBin PPSSPPQt)
- list(APPEND targetExtra
- Common/Render/Text/draw_text_qt.cpp
- Common/Render/Text/draw_text_qt.h
- )
-
- # Enable SDL joystick if SDL is found
- if(SDL_LIB_TARGET)
- add_compile_definitions(SDL)
- list(APPEND targetExtra
- SDL/SDLJoystick.h
- SDL/SDLJoystick.cpp
- )
- list(APPEND targetExtraLibs ${SDL_LIB_TARGET})
- endif()
-
elseif(WIN32)
# Don't care about SDL.
set(TargetBin PPSSPPWindows)
@@ -1528,9 +1484,6 @@ if(TargetBin)
else()
add_executable(${TargetBin} MACOSX_BUNDLE ${ICON_PATH_ABS} ${NativeAssets} ${BigFontAssets} ${UIImages} ${SHADER_FILES} ${THEME_FILE} ${DEBUGGER_FILES} ${WEB_UPLOAD_FILES} ${FLASH0_FILES} ${LANG_FILES} ${NativeAppSource})
file(INSTALL "${CMAKE_SOURCE_DIR}/ext/vulkan/macOS/Frameworks/libMoltenVK.dylib" DESTINATION "${CMAKE_BINARY_DIR}/${TargetBin}.app/Contents/Frameworks/")
- if(USING_QT_UI)
- add_custom_command(TARGET ${TargetBin} POST_BUILD COMMAND /bin/bash "${CMAKE_SOURCE_DIR}/Qt/macbundle.sh" "${CMAKE_BINARY_DIR}/PPSSPPQt.app")
- endif()
endif()
elseif(WIN32)
add_executable(${TargetBin} WIN32 ${NativeAppSource})
diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj
index 042a8472ac..b0c4a68747 100644
--- a/Common/Common.vcxproj
+++ b/Common/Common.vcxproj
@@ -503,7 +503,6 @@
true
true
-
@@ -975,7 +974,6 @@
-
diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters
index e9d3d4dca2..45235ce676 100644
--- a/Common/Common.vcxproj.filters
+++ b/Common/Common.vcxproj.filters
@@ -323,9 +323,6 @@
Render\Text
-
- Render\Text
-
Render\Text
@@ -1097,9 +1094,6 @@
Render\Text
-
- Render\Text
-
Render\Text
diff --git a/Common/Input/InputState.h b/Common/Input/InputState.h
index 588af44509..5bce680231 100644
--- a/Common/Input/InputState.h
+++ b/Common/Input/InputState.h
@@ -183,7 +183,7 @@ ENUM_CLASS_BITOPS(KeyInputFlags);
struct KeyInput {
KeyInput() {}
- // These utility constructors are used a lot in SDL/Qt.
+ // These utility constructors are used a lot in SDL.
KeyInput(InputDeviceID devId, InputKeyCode code, KeyInputFlags fl) : deviceId(devId), keyCode(code), flags(fl) {}
KeyInput(InputDeviceID devId, int unicode) : deviceId(devId), unicodeChar(unicode), flags(KeyInputFlags::CHAR) {}
InputDeviceID deviceId;
diff --git a/Common/Render/Text/draw_text.cpp b/Common/Render/Text/draw_text.cpp
index 5e08919dc8..254cb7a7c7 100644
--- a/Common/Render/Text/draw_text.cpp
+++ b/Common/Render/Text/draw_text.cpp
@@ -16,7 +16,6 @@
#include "Common/Render/Text/draw_text.h"
#include "Common/Render/Text/draw_text_win.h"
#include "Common/Render/Text/draw_text_cocoa.h"
-#include "Common/Render/Text/draw_text_qt.h"
#include "Common/Render/Text/draw_text_android.h"
#include "Common/Render/Text/draw_text_sdl.h"
#include "Common/Render/Text/draw_text_uwp.h"
@@ -301,7 +300,7 @@ TextDrawer *TextDrawer::Create(Draw::DrawContext *draw) {
// No text drawer
#elif PPSSPP_PLATFORM(UWP)
drawer = new TextDrawerUWP(draw);
-#elif defined(_WIN32) && !defined(USING_QT_UI)
+#elif defined(_WIN32)
// If RenderDoc is active, we can't use the UWP drawer since it uses D3D11 to initialize D2D,
// and RenderDoc doesn't permit multiple graphics contexts.
// Also, this seems to cause failures under Windows 7, so let's gate on Win 10 to be safe.
@@ -312,8 +311,6 @@ TextDrawer *TextDrawer::Create(Draw::DrawContext *draw) {
}
#elif PPSSPP_PLATFORM(MAC) || PPSSPP_PLATFORM(IOS)
drawer = new TextDrawerCocoa(draw);
-#elif defined(USING_QT_UI)
- drawer = new TextDrawerQt(draw);
#elif PPSSPP_PLATFORM(ANDROID)
drawer = new TextDrawerAndroid(draw);
#elif USE_SDL3_TTF
diff --git a/Common/Render/Text/draw_text_qt.cpp b/Common/Render/Text/draw_text_qt.cpp
deleted file mode 100644
index 7fb0fc38fa..0000000000
--- a/Common/Render/Text/draw_text_qt.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-#include "Common/System/Display.h"
-#include "Common/GPU/thin3d.h"
-#include "Common/Data/Hash/Hash.h"
-#include "Common/Data/Text/WrapText.h"
-#include "Common/Data/Encoding/Utf8.h"
-#include "Common/File/VFS/VFS.h"
-#include "Common/Render/Text/draw_text.h"
-#include "Common/Render/Text/draw_text_qt.h"
-
-#include "Common/Log.h"
-
-#if defined(USING_QT_UI)
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-TextDrawerQt::TextDrawerQt(Draw::DrawContext *draw) : TextDrawer(draw) {
- // Add all fonts we ship with.
-
- std::vector filenames = GetAllFontFilenames();
-
- for (const auto &iter : filenames) {
- std::string fn = "assets/" + iter + ".ttf";
- size_t fontSize = 0;
- uint8_t *fontData = g_VFS.ReadFile(fn.c_str(), &fontSize);
- if (fontData) {
- int fontID = QFontDatabase::addApplicationFontFromData(QByteArray((const char *)fontData, fontSize));
- delete[] fontData;
- QStringList fontsFound = QFontDatabase::applicationFontFamilies(fontID);
- if (fontsFound.size() == 0) {
- WARN_LOG(Log::G3D, "Failed to load font from %s", fn.c_str());
- } else {
- for (const auto &f : fontsFound) {
- WARN_LOG(Log::G3D, "Loaded font %s from %s", f.toUtf8().constData(), fn.c_str());
- }
- }
- } else {
- ERROR_LOG(Log::G3D, "Failed to load font file %s", fn.c_str());
- }
- }
-}
-
-TextDrawerQt::~TextDrawerQt() {
- ClearCache();
- ClearFonts();
-}
-
-void TextDrawerQt::SetOrCreateFont(const FontStyle &style) {
- auto iter = fontMap_.find(style);
- if (iter != fontMap_.end()) {
- fontStyle_ = style;
- return;
- }
-
- FontStyleFlags styleFlags;
- std::string fontName = GetFontNameForFontStyle(style, &styleFlags);
-
- QFont *font = new QFont(fontName.c_str());
- font->setPixelSize((int)((style.sizePts + 6) / dpiScale_));
- font->setBold(styleFlags & FontStyleFlags::Bold);
- if (styleFlags & FontStyleFlags::Light) {
- font->setWeight(QFont::Light);
- }
- font->setItalic(styleFlags & FontStyleFlags::Italic);
- font->setUnderline(styleFlags & FontStyleFlags::Underline);
- font->setStrikeOut(styleFlags & FontStyleFlags::Strikethrough);
-
- fontMap_[style] = font;
- fontStyle_ = style;
-}
-
-void TextDrawerQt::MeasureStringInternal(std::string_view str, float *w, float *h) {
- QFont* font = fontMap_.find(fontStyle_)->second;
- QFontMetrics fm(*font);
- QSize size = fm.size(0, QString::fromUtf8(str.data(), str.length()));
-
- *w = size.width();
- *h = size.height();
-}
-
-bool TextDrawerQt::DrawStringBitmap(std::vector &bitmapData, TextStringEntry &entry, Draw::DataFormat texFormat, std::string_view str, int align, bool fullColor) {
- _dbg_assert_(!fullColor);
-
- if (str.empty()) {
- bitmapData.clear();
- return false;
- }
-
- QFont *font = fontMap_.find(fontStyle_)->second;
- QFontMetrics fm(*font);
- QSize size = fm.size(0, QString::fromUtf8(str.data(), str.length()));
- QImage image((size.width() + 3) & ~3, (size.height() + 3) & ~3, QImage::Format_ARGB32_Premultiplied);
- if (image.isNull()) {
- bitmapData.clear();
- return false;
- }
- image.fill(0);
-
- QPainter painter;
- painter.begin(&image);
- painter.setFont(*font);
- painter.setPen(0xFFFFFFFF);
- // TODO: Involve ALIGN_HCENTER (bounds etc.)
- painter.drawText(image.rect(), Qt::AlignTop | Qt::AlignLeft, QString::fromUtf8(str.data(), str.length()));
- painter.end();
-
- entry.texture = nullptr;
- entry.bmWidth = entry.width = image.width();
- entry.bmHeight = entry.height = image.height();
- entry.lastUsedFrame = frameCount_;
-
- if (texFormat == Draw::DataFormat::B4G4R4A4_UNORM_PACK16 || texFormat == Draw::DataFormat::R4G4B4A4_UNORM_PACK16) {
- bitmapData.resize(entry.bmWidth * entry.bmHeight * sizeof(uint16_t));
- uint16_t *bitmapData16 = (uint16_t *)&bitmapData[0];
- for (int x = 0; x < entry.bmWidth; x++) {
- for (int y = 0; y < entry.bmHeight; y++) {
- bitmapData16[entry.bmWidth * y + x] = AlphaToPremul4444(image.pixel(x, y) >> 24);
- }
- }
- } else if (texFormat == Draw::DataFormat::R8_UNORM) {
- bitmapData.resize(entry.bmWidth * entry.bmHeight);
- for (int x = 0; x < entry.bmWidth; x++) {
- for (int y = 0; y < entry.bmHeight; y++) {
- bitmapData[entry.bmWidth * y + x] = image.pixel(x, y) >> 24;
- }
- }
- } else {
- _assert_msg_(false, "Bad TextDrawer format");
- }
- return true;
-}
-
-void TextDrawerQt::ClearFonts() {
- // Also wipe the font map.
- for (auto iter : fontMap_) {
- delete iter.second;
- }
- fontMap_.clear();
- fontStyle_ = {};
-}
-
-#endif
diff --git a/Common/Render/Text/draw_text_qt.h b/Common/Render/Text/draw_text_qt.h
deleted file mode 100644
index 0f566fd9d9..0000000000
--- a/Common/Render/Text/draw_text_qt.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#pragma once
-
-#include "ppsspp_config.h"
-
-#include