File qt6-full-migration.patch of Package nova-video-player-beta

From: Nova Video Player Team <team@nova-video-player.com>
Date: Sat, 28 Dec 2025 15:30:00 +0300
Subject: [PATCH] Full Qt5 to Qt6 migration

This patch migrates Nova Video Player from Qt5 to Qt6:
- Updated CMake configuration
- Changed Qt5 includes to Qt6
- Updated QML imports
- Fixed deprecated APIs
- Added Qt6-specific features

---
 CMakeLists.txt                                   | 44 ++++++++++------
 .../metadatafetcher/MetadataFetcher.cpp         |  6 +-
 src/components/playlist/PlaylistModel.cpp       | 10 ++--
 src/components/videoplayer/VideoPlayer.cpp      | 22 ++++----
 src/components/videoplayer/VideoPlayer.h        |  8 +--
 src/gui/MainWindow.cpp                          | 18 +++---
 src/gui/MainWindow.h                            |  6 +-
 src/gui/qml/main.qml                            |  6 +-
 src/gui/qml/components/MediaCard.qml            |  4 +-
 src/gui/qml/components/SettingsPanel.qml        |  8 +--
 src/gui/qml/pages/LibraryPage.qml               |  4 +-
 src/gui/qml/pages/PlayerPage.qml                | 10 ++--
 src/utils/FileUtils.cpp                         |  8 +--
 13 files changed, 95 insertions(+), 59 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a1b2c3d..d4e5f6a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
-cmake_minimum_required(VERSION 3.16)
+cmake_minimum_required(VERSION 3.22)
 project(nova-video-player VERSION 6.4.25 LANGUAGES CXX)
 
-set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_CXX_EXTENSIONS OFF)
 
@@ -15,25 +15,37 @@ set(CMAKE_AUTOMOC ON)
 set(CMAKE_AUTORCC ON)
 set(CMAKE_AUTOUIC ON)
 
-# Find Qt5 components
-find_package(Qt5 5.15 REQUIRED COMPONENTS
-    Core
-    Gui
-    Widgets
-    Quick
-    QuickControls2
-    Multimedia
-    Network
-    Sql
-    Svg
-    Qml
-    WebEngine
-    WebEngineWidgets
-    WebChannel
+# Find Qt6 components
+find_package(Qt6 6.7 REQUIRED COMPONENTS
+    Core
+    Gui
+    Widgets
+    Quick
+    QuickControls2
+    Multimedia
+    Network
+    Sql
+    Svg
+    Qml
+    WebEngineCore
+    WebChannel
+    ShaderTools
+    StateMachine
 )
 
-# Qt5 modules
-set(QT_MODULES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Quick Qt5::QuickControls2
-               Qt5::Multimedia Qt5::Network Qt5::Sql Qt5::Svg Qt5::Qml Qt5::WebEngine Qt5::WebEngineWidgets Qt5::WebChannel)
+# Qt6 modules
+set(QT_MODULES 
+    Qt6::Core
+    Qt6::Gui
+    Qt6::Widgets
+    Qt6::Quick
+    Qt6::QuickControls2
+    Qt6::Multimedia
+    Qt6::Network
+    Qt6::Sql
+    Qt6::Svg
+    Qt6::Qml
+    Qt6::WebEngineCore
+)
 
 # Find VLC
 find_package(VLC 4.0 REQUIRED)
@@ -41,13 +53,13 @@ find_package(VLC 4.0 REQUIRED)
 # Find FFmpeg 8
 find_package(FFmpeg 8.0 REQUIRED COMPONENTS avcodec avformat avutil avfilter swscale swresample)
 
-# Qt5 Multimedia additional dependencies
-if(TARGET Qt5::Multimedia)
-    get_target_property(QT_MULTIMEDIA_INCLUDES Qt5::Multimedia INTERFACE_INCLUDE_DIRECTORIES)
+# Qt6 Multimedia additional dependencies
+if(TARGET Qt6::Multimedia)
+    get_target_property(QT_MULTIMEDIA_INCLUDES Qt6::Multimedia INTERFACE_INCLUDE_DIRECTORIES)
     include_directories(${QT_MULTIMEDIA_INCLUDES})
     
     # Check for multimedia backend
-    find_package(Qt5MultimediaBackend)
+    find_package(Qt6MultimediaBackend)
 endif()
 
 # Add definitions
@@ -156,7 +168,7 @@ target_link_libraries(${PROJECT_NAME}
     ${VLC_LIBRARIES}
     ${FFMPEG_LIBRARIES}
     ${QT_MODULES}
-    Qt5::MultimediaWidgets
+    Qt6::Widgets
     ${LIBTORRENT_LIBRARIES}
     ${SQLITE3_LIBRARIES}
     ${CURL_LIBRARIES}
diff --git a/src/components/metadatafetcher/MetadataFetcher.cpp b/src/components/metadatafetcher/MetadataFetcher.cpp
index 789abcd..ef12345 100644
--- a/src/components/metadatafetcher/MetadataFetcher.cpp
+++ b/src/components/metadatafetcher/MetadataFetcher.cpp
@@ -1,8 +1,8 @@
 #include "MetadataFetcher.h"
 
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QJsonDocument>
+#include <QtNetwork/QNetworkAccessManager>
+#include <QtNetwork/QNetworkReply>
+#include <QtCore/QJsonDocument>
 #include <QUrlQuery>
 
 MetadataFetcher::MetadataFetcher(QObject *parent)
diff --git a/src/components/playlist/PlaylistModel.cpp b/src/components/playlist/PlaylistModel.cpp
index 456defg..789hijk 100644
--- a/src/components/playlist/PlaylistModel.cpp
+++ b/src/components/playlist/PlaylistModel.cpp
@@ -1,12 +1,12 @@
 #include "PlaylistModel.h"
 
-#include <QFileInfo>
-#include <QDir>
-#include <QStandardPaths>
-#include <QDateTime>
+#include <QtCore/QFileInfo>
+#include <QtCore/QDir>
+#include <QtCore/QStandardPaths>
+#include <QtCore/QDateTime>
 
 // Qt Multimedia headers updated for Qt6
-#include <QMediaMetaData>
+#include <QtMultimedia/QMediaMetaData>
 
 PlaylistModel::PlaylistModel(QObject *parent)
     : QAbstractListModel(parent)
diff --git a/src/components/videoplayer/VideoPlayer.cpp b/src/components/videoplayer/VideoPlayer.cpp
index 123abcd..456cdef 100644
--- a/src/components/videoplayer/VideoPlayer.cpp
+++ b/src/components/videoplayer/VideoPlayer.cpp
@@ -1,14 +1,14 @@
 #include "VideoPlayer.h"
 
-#include <QApplication>
-#include <QScreen>
-#include <QTimer>
-#include <QDir>
-#include <QStandardPaths>
-#include <QOpenGLContext>
-#include <QOpenGLFunctions>
+#include <QtWidgets/QApplication>
+#include <QtGui/QScreen>
+#include <QtCore/QTimer>
+#include <QtCore/QDir>
+#include <QtCore/QStandardPaths>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLFunctions>
 #ifdef Q_OS_LINUX
-#include <QWindow>
+#include <QtGui/QWindow>
 #endif
 
 #include <vlc/vlc.h>
@@ -30,12 +30,12 @@ VideoPlayer::VideoPlayer(QObject *parent)
     m_vlcInstance(nullptr),
     m_vlcMediaPlayer(nullptr)
 {
-    // Qt5 -> Qt6: QMediaPlayer is now in Qt Multimedia module
+    // Qt6 Multimedia initialization
 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
-    m_audioOutput = new QAudioOutput(this);
+    m_audioOutput = new QAudioOutput(QMediaDevices::defaultAudioOutput(), this);
     m_mediaPlayer = new QMediaPlayer(this);
     m_mediaPlayer->setAudioOutput(m_audioOutput);
-    connect(m_mediaPlayer, &QMediaPlayer::errorOccurred, this, &VideoPlayer::handleError);
+    connect(m_mediaPlayer, &QMediaPlayer::errorChanged, this, &VideoPlayer::handleError);
 #else
     m_mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
     connect(m_mediaPlayer, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error), this, &VideoPlayer::handleError);
@@ -243,7 +243,7 @@ void VideoPlayer::setVolume(int volume)
         m_vlcMediaPlayer && libvlc_audio_set_volume(m_vlcMediaPlayer, volume) == 0;
     
     // Qt Multimedia volume
-    if (m_audioOutput) {
+    if (m_audioOutput && m_audioOutput->isValid()) {
         float normalizedVolume = qBound(0.0f, volume / 100.0f, 1.0f);
         m_audioOutput->setVolume(normalizedVolume);
     }
diff --git a/src/components/videoplayer/VideoPlayer.h b/src/components/videoplayer/VideoPlayer.h
index abcdef1..2345678 100644
--- a/src/components/videoplayer/VideoPlayer.h
+++ b/src/components/videoplayer/VideoPlayer.h
@@ -4,12 +4,12 @@
 
 #include <QObject>
 #include <QScopedPointer>
-#include <QMediaPlayer>
-#include <QVideoWidget>
+#include <QtMultimedia/QMediaPlayer>
+#include <QtMultimediaWidgets/QVideoWidget>
 
 // Qt6 audio changes
 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
-#include <QAudioOutput>
+#include <QtMultimedia/QAudioOutput>
 #endif
 
 // Forward declarations for VLC
@@ -38,7 +38,7 @@ private:
     libvlc_media_player_t *m_vlcMediaPlayer;
     
 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
-    QAudioOutput *m_audioOutput;
+    QScopedPointer<QAudioOutput> m_audioOutput;
 #endif
 };
 
diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
index 3456789..9012345 100644
--- a/src/gui/MainWindow.cpp
+++ b/src/gui/MainWindow.cpp
@@ -1,13 +1,13 @@
 #include "MainWindow.h"
 
-#include <QApplication>
-#include <QMenuBar>
-#include <QStatusBar>
-#include <QToolBar>
-#include <QAction>
-#include <QFileDialog>
-#include <QMessageBox>
-#include <QSettings>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QMenuBar>
+#include <QtWidgets/QStatusBar>
+#include <QtWidgets/QToolBar>
+#include <QtWidgets/QAction>
+#include <QtWidgets/QFileDialog>
+#include <QtWidgets/QMessageBox>
+#include <QtCore/QSettings>
 
 #include "components/videoplayer/VideoPlayer.h"
 
@@ -22,7 +22,7 @@ MainWindow::MainWindow(QWidget *parent)
     createStatusBar();
     
     // Qt6: Use QWindow for better Wayland support
-#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_LINUX)
+#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) && defined(Q_OS_LINUX)
     if (QGuiApplication::platformName().contains("wayland")) {
         setAttribute(Qt::WA_NativeWindow);
         windowHandle()->setFlag(Qt::FramelessWindowHint, false);
@@ -110,7 +110,9 @@ void MainWindow::createStatusBar()
 
 void MainWindow::updateWindowTitle()
 {
-    QString title = QString("Nova Video Player %1 - VLC4 Beta").arg(QApplication::applicationVersion());
+    QString title = QString("Nova Video Player %1 - VLC4 Beta (Qt6)")
+                    .arg(QApplication::applicationVersion())
+                    .arg(QT_VERSION_STR);
     setWindowTitle(title);
 }
 
diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
index 5678901..234abcd 100644
--- a/src/gui/MainWindow.h
+++ b/src/gui/MainWindow.h
@@ -3,9 +3,9 @@
 
 #include <QMainWindow>
 
-#include <QQuickView>
-#include <QQmlEngine>
-#include <QQmlContext>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
+#include <QtQml/QQmlContext>
 
 class MainWindow : public QMainWindow
 {
diff --git a/src/gui/qml/main.qml b/src/gui/qml/main.qml
index 1234abc..5678def 100644
--- a/src/gui/qml/main.qml
+++ b/src/gui/qml/main.qml
@@ -1,8 +1,8 @@
 import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick.Controls 6.7
 import QtQuick.Layouts 1.15
-import QtMultimedia 5.15
-import QtWebEngine 1.10
+import QtMultimedia 6.7
+import QtWebEngine 6.7
 
 ApplicationWindow {
     id: mainWindow
diff --git a/src/gui/qml/components/MediaCard.qml b/src/gui/qml/components/MediaCard.qml
index abc1234..def5678 100644
--- a/src/gui/qml/components/MediaCard.qml
+++ b/src/gui/qml/components/MediaCard.qml
@@ -1,5 +1,5 @@
 import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick.Controls 6.7
 
 Rectangle {
     id: mediaCard
@@ -56,7 +56,7 @@ Rectangle {
             
             Label {
                 text: model.duration
-                color: Qt.rgba(1, 1, 1, 0.7)
+                color: "gray"
                 font.pixelSize: 12
             }
         }
diff --git a/src/gui/qml/components/SettingsPanel.qml b/src/gui/qml/components/SettingsPanel.qml
index 7890abc..1234def 100644
--- a/src/gui/qml/components/SettingsPanel.qml
+++ b/src/gui/qml/components/SettingsPanel.qml
@@ -1,7 +1,7 @@
 import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick.Controls 6.7
 import QtQuick.Layouts 1.15
-import QtQuick.Dialogs 1.3
+import QtQuick.Dialogs 6.7
 
 ColumnLayout {
     id: settingsPanel
@@ -83,12 +83,12 @@ ColumnLayout {
         }
         
         ComboBox {
-            model: ["VLC 4 (libplacebo)", "Qt Multimedia", "GStreamer"]
+            model: ["VLC 4 (libplacebo + Vulkan)", "Qt Multimedia", "FFmpeg"]
             currentIndex: settings.videoBackend
             onCurrentIndexChanged: {
                 settings.videoBackend = currentIndex
                 if (currentIndex === 0) {
-                    console.log("Using VLC 4 with libplacebo rendering")
+                    console.log("Using VLC 4 with libplacebo + Vulkan rendering")
                 }
             }
         }
diff --git a/src/gui/qml/pages/LibraryPage.qml b/src/gui/qml/pages/LibraryPage.qml
index 4567abc..8901def 100644
--- a/src/gui/qml/pages/LibraryPage.qml
+++ b/src/gui/qml/pages/LibraryPage.qml
@@ -1,5 +1,5 @@
 import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick.Controls 6.7
 import QtQuick.Layouts 1.15
 
 Page {
@@ -45,7 +45,7 @@ Page {
             
             ToolButton {
                 icon.name: "view-refresh"
-                onClicked: libraryModel.refresh()
+                onClicked: libraryModel.refreshAll()
             }
         }
     }
diff --git a/src/gui/qml/pages/PlayerPage.qml b/src/gui/qml/pages/PlayerPage.qml
index 2345abc..6789def 100644
--- a/src/gui/qml/pages/PlayerPage.qml
+++ b/src/gui/qml/pages/PlayerPage.qml
@@ -1,7 +1,7 @@
 import QtQuick 2.15
-import QtQuick.Controls 2.15
+import QtQuick.Controls 6.7
 import QtQuick.Layouts 1.15
-import QtMultimedia 5.15
+import QtMultimedia 6.7
 
 Page {
     id: playerPage
@@ -89,13 +89,13 @@ Page {
             
             ToolButton {
                 icon.name: "audio-volume-high"
-                onClicked: videoPlayer.toggleMute()
+                onClicked: videoPlayer.muted = !videoPlayer.muted
             }
             
             Slider {
                 id: volumeSlider
                 from: 0
-                to: 100
+                to: 1.0
                 value: videoPlayer.volume
                 onValueChanged: videoPlayer.volume = value
             }
diff --git a/src/utils/FileUtils.cpp b/src/utils/FileUtils.cpp
index 890abcd..123ef45 100644
--- a/src/utils/FileUtils.cpp
+++ b/src/utils/FileUtils.cpp
@@ -1,8 +1,8 @@
 #include "FileUtils.h"
 
-#include <QFileInfo>
-#include <QDir>
-#include <QStandardPaths>
+#include <QtCore/QFileInfo>
+#include <QtCore/QDir>
+#include <QtCore/QStandardPaths>
 #include <QDebug>
 
 QString FileUtils::getCacheDirectory()
@@ -40,4 +40,4 @@ QString FileUtils::sanitizeFileName(const QString &fileName)
     QString sanitized = fileName;
     // Remove invalid characters
     return sanitized.remove(QRegExp("[<>:\"|?*]"));
-}
\ No newline at end of file
+}
-- 
2.43.0
openSUSE Build Service is sponsored by