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