From 3180e1d6642df43cf2e1ce085095f3640fb95fe4 Mon Sep 17 00:00:00 2001 From: Stephan Schielke Date: Tue, 1 Jul 2025 18:31:18 +0100 Subject: [PATCH] Migrate from PySide2 to PySide6 to fix Qt symbol compatibility issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Updated all import statements from PySide2 to PySide6 across the codebase - Fixed QAction import (moved from QtWidgets to QtGui in PySide6) - Updated dependencies: PySide2~=5.15 → PySide6~=6.5 - Switched to opencv-contrib-python-headless to avoid Qt conflicts - Fixed indentation errors in uihelper_transparency.py - Resolves ImportError: undefined symbol _ZdlPvm, version Qt_5 --- pyproject.toml | 4 ++-- src/photoglimmer/colorcurverwidget.py | 9 ++++----- src/photoglimmer/customfiledialog.py | 6 +++--- src/photoglimmer/imagewidget.py | 3 +-- src/photoglimmer/photoglimmer_ui.py | 15 ++++++++------- src/photoglimmer/prefs/preferences_dialog.py | 6 +++--- src/photoglimmer/prefs/settings_config.py | 2 +- src/photoglimmer/requirements.txt | 20 ++++++++++---------- src/photoglimmer/threadwork.py | 7 +++---- src/photoglimmer/uihelper_transparency.py | 7 +++---- 10 files changed, 38 insertions(+), 41 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7620179..0bbcfdf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,8 +41,8 @@ test_sources = [ requires = [ -"opencv-contrib-python==4.8.1.78", -"PySide2~=5.15", +"opencv-contrib-python-headless==4.8.1.78", +"PySide6~=6.5", "mediapipe==0.10.7", "numpy~=1.19", "pyqtdarktheme ~=2.1.0", diff --git a/src/photoglimmer/colorcurverwidget.py b/src/photoglimmer/colorcurverwidget.py index 468df5e..23ee39b 100644 --- a/src/photoglimmer/colorcurverwidget.py +++ b/src/photoglimmer/colorcurverwidget.py @@ -1,9 +1,8 @@ - import sys -from PySide2 import QtWidgets, QtGui, QtCore -from PySide2.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton # Added layouts/button -from PySide2.QtGui import QPainter, QPen, QBrush, QColor, QPainterPath, QPalette -from PySide2.QtCore import QPointF, QRectF, Qt, Signal +from PySide6 import QtWidgets, QtGui, QtCore +from PySide6.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton # Added layouts/button +from PySide6.QtGui import QPainter, QPen, QBrush, QColor, QPainterPath, QPalette +from PySide6.QtCore import QPointF, QRectF, Qt, Signal import math from pympler import asizeof # import copy # Needed for deep copying QPointF list during save/load if necessary diff --git a/src/photoglimmer/customfiledialog.py b/src/photoglimmer/customfiledialog.py index b6b14b4..06e2534 100644 --- a/src/photoglimmer/customfiledialog.py +++ b/src/photoglimmer/customfiledialog.py @@ -5,9 +5,9 @@ # File license CC BY-SA 3.0 # ############################################################################### import sys -from PySide2.QtCore import Qt -from PySide2.QtGui import QPixmap -from PySide2.QtWidgets import QApplication, QFileDialog, QVBoxLayout, QLabel, QDialog +from PySide6.QtCore import Qt +from PySide6.QtGui import QPixmap +from PySide6.QtWidgets import QApplication, QFileDialog, QVBoxLayout, QLabel, QDialog import qdarktheme diff --git a/src/photoglimmer/imagewidget.py b/src/photoglimmer/imagewidget.py index 1f2a22e..489b5a5 100644 --- a/src/photoglimmer/imagewidget.py +++ b/src/photoglimmer/imagewidget.py @@ -1,4 +1,3 @@ - # ############################################################################### # Copyright : Rahul Singh # URL : https://github.com/codecliff/PhotoGlimmer @@ -14,7 +13,7 @@ # ############################################################################### import sys from enum import Enum -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets # --- Interaction Modes Enum --- diff --git a/src/photoglimmer/photoglimmer_ui.py b/src/photoglimmer/photoglimmer_ui.py index a63dd01..91817d1 100644 --- a/src/photoglimmer/photoglimmer_ui.py +++ b/src/photoglimmer/photoglimmer_ui.py @@ -14,11 +14,11 @@ #imports import os, sys, shutil, time, tempfile # QT -from PySide2 import QtWidgets, QtCore -from PySide2.QtUiTools import QUiLoader -from PySide2.QtGui import QPixmap, QIcon, QMovie, QKeySequence -from PySide2.QtCore import QThreadPool, QFile,QSettings,QStandardPaths -from PySide2.QtWidgets import QStyle, QMessageBox, QAction, QGridLayout,QLabel, QDialog +from PySide6 import QtWidgets, QtCore +from PySide6.QtUiTools import QUiLoader +from PySide6.QtGui import QPixmap, QIcon, QMovie, QKeySequence, QAction +from PySide6.QtCore import QThreadPool, QFile,QSettings,QStandardPaths +from PySide6.QtWidgets import QStyle, QMessageBox, QGridLayout,QLabel, QDialog # Only if using qdarktheme style import qdarktheme # This application @@ -190,7 +190,7 @@ def setUpMyUI(self): def getImagesDirectory(self): - from PySide2.QtCore import QStandardPaths + from PySide6.QtCore import QStandardPaths pth=QStandardPaths.PicturesLocation sysimgfolder= str(QStandardPaths.writableLocation(pth) ) if os.path.exists(sysimgfolder): @@ -636,7 +636,8 @@ def openBrowser(self, path_to_open): def getScreenSize( self ): - from PySide2.QtWidgets import QApplication, QDesktopWidget + from PySide6.QtWidgets import QApplication + from PySide6.QtGui import QScreen desktop = QDesktopWidget() screen_width = desktop.screenGeometry().width() screen_height = desktop.screenGeometry().height() diff --git a/src/photoglimmer/prefs/preferences_dialog.py b/src/photoglimmer/prefs/preferences_dialog.py index 36e0d75..8d02d90 100644 --- a/src/photoglimmer/prefs/preferences_dialog.py +++ b/src/photoglimmer/prefs/preferences_dialog.py @@ -2,11 +2,11 @@ # preferences_dialog.py import sys import os -from PySide2.QtWidgets import (QApplication, QDialog, QFileDialog, QMessageBox, +from PySide6.QtWidgets import (QApplication, QDialog, QFileDialog, QMessageBox, QWidget, QRadioButton, QVBoxLayout, QDialogButtonBox) -from PySide2.QtCore import QFile, QSettings, QStandardPaths, Slot -from PySide2.QtUiTools import QUiLoader +from PySide6.QtCore import QFile, QSettings, QStandardPaths, Slot +from PySide6.QtUiTools import QUiLoader # --- Import the configuration --- #standard way of importing form same package is to add . prefix from .settings_config import SettingsConfig diff --git a/src/photoglimmer/prefs/settings_config.py b/src/photoglimmer/prefs/settings_config.py index 7551cac..d572dd1 100644 --- a/src/photoglimmer/prefs/settings_config.py +++ b/src/photoglimmer/prefs/settings_config.py @@ -1,6 +1,6 @@ # settings_config.py -from PySide2.QtCore import QStandardPaths +from PySide6.QtCore import QStandardPaths class SettingsConfig: diff --git a/src/photoglimmer/requirements.txt b/src/photoglimmer/requirements.txt index 87fd85a..00f7621 100644 --- a/src/photoglimmer/requirements.txt +++ b/src/photoglimmer/requirements.txt @@ -1,10 +1,10 @@ -"opencv-contrib-python==4.8.1.78", -"PySide2~=5.15", -"mediapipe==0.10.7", -"numpy~=1.19", -"pyqtdarktheme ~=2.1.0", -"splines ~= 0.3.0", -"piexif ~= 1.1.3", -"Pympler ~=1.1", -"memory-profiler ~=0.61.0", -"line-profiler ~=4.2.0" +opencv-contrib-python-headless==4.8.1.78 +PySide6~=6.5 +mediapipe==0.10.7 +numpy~=1.19 +pyqtdarktheme~=2.1.0 +splines~=0.3.0 +piexif~=1.1.3 +Pympler~=1.1 +memory-profiler~=0.61.0 +line-profiler~=4.2.0 diff --git a/src/photoglimmer/threadwork.py b/src/photoglimmer/threadwork.py index 451b68d..9a7c933 100644 --- a/src/photoglimmer/threadwork.py +++ b/src/photoglimmer/threadwork.py @@ -1,9 +1,8 @@ - # source for all the code in this file : # https://gist.github.com/sabapathygithub/160ecf262063bcb826787a7af1637f44 -from PySide2.QtCore import QObject,QRunnable,QThreadPool -from PySide2.QtCore import Signal as pyqtSignal -from PySide2.QtCore import Slot as pyqtSlot +from PySide6.QtCore import QObject,QRunnable,QThreadPool +from PySide6.QtCore import Signal as pyqtSignal +from PySide6.QtCore import Slot as pyqtSlot import sys,traceback diff --git a/src/photoglimmer/uihelper_transparency.py b/src/photoglimmer/uihelper_transparency.py index c950a22..b88f48b 100644 --- a/src/photoglimmer/uihelper_transparency.py +++ b/src/photoglimmer/uihelper_transparency.py @@ -1,4 +1,3 @@ - # import backend import os import photoglimmer.photoglimmer_backend as backend @@ -14,8 +13,8 @@ def __init__(self, uiobject): def convert_and_copy_to_clipboard(self, bgra_image): - from PySide2.QtGui import QImage, QPixmap,QClipboard - from PySide2.QtWidgets import QApplication + from PySide6.QtGui import QImage, QPixmap,QClipboard + from PySide6.QtWidgets import QApplication rgba_image = backend.cv2.cvtColor(bgra_image, backend.cv2.COLOR_BGRA2RGBA) height, width, channels = rgba_image.shape bytes_per_line = channels * width @@ -23,7 +22,7 @@ def convert_and_copy_to_clipboard(self, bgra_image): QImage.Format_RGBA8888) clipboard = QApplication.clipboard() clipboard.setPixmap(QPixmap(qimage), QClipboard.Clipboard) - return + return def transparency_to_clipboard( self, tempdirpath,originalImgPath):