From f2f9927ef3e8550b3d7c16c72073fce9150ddfa1 Mon Sep 17 00:00:00 2001 From: Kentaro Wada Date: Sun, 16 Feb 2025 22:46:16 +0900 Subject: [PATCH] Drop qtpy and use PyQt5 instead --- labelme/__main__.py | 4 +-- labelme/app.py | 8 ++--- labelme/shape.py | 4 +-- labelme/utils/qt.py | 6 ++-- labelme/widgets/ai_prompt_widget.py | 2 +- labelme/widgets/brightness_contrast_dialog.py | 6 ++-- labelme/widgets/canvas.py | 22 +++++++------- labelme/widgets/color_dialog.py | 2 +- labelme/widgets/escapable_qlist_widget.py | 4 +-- labelme/widgets/file_dialog_preview.py | 6 ++-- labelme/widgets/label_dialog.py | 6 ++-- labelme/widgets/label_list_widget.py | 18 +++++------ labelme/widgets/tool_bar.py | 4 +-- labelme/widgets/unique_label_qlist_widget.py | 4 +-- labelme/widgets/zoom_widget.py | 6 ++-- setup.py | 30 +------------------ .../widgets_tests/test_label_dialog.py | 4 +-- 17 files changed, 54 insertions(+), 82 deletions(-) diff --git a/labelme/__main__.py b/labelme/__main__.py index a832a6cac..61fe13895 100644 --- a/labelme/__main__.py +++ b/labelme/__main__.py @@ -6,8 +6,8 @@ import yaml from loguru import logger -from qtpy import QtCore -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtWidgets from labelme import __appname__ from labelme import __version__ diff --git a/labelme/app.py b/labelme/app.py index 729b6f20b..1d334e9ef 100644 --- a/labelme/app.py +++ b/labelme/app.py @@ -12,10 +12,10 @@ import natsort import numpy as np from loguru import logger -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets -from qtpy.QtCore import Qt +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt from labelme import __appname__ from labelme import ai diff --git a/labelme/shape.py b/labelme/shape.py index 99f51bc63..d41ca3a0f 100644 --- a/labelme/shape.py +++ b/labelme/shape.py @@ -3,8 +3,8 @@ import numpy as np import skimage.measure from loguru import logger -from qtpy import QtCore -from qtpy import QtGui +from PyQt5 import QtCore +from PyQt5 import QtGui import labelme.utils diff --git a/labelme/utils/qt.py b/labelme/utils/qt.py index 7fed3ad18..98e7b0e96 100644 --- a/labelme/utils/qt.py +++ b/labelme/utils/qt.py @@ -2,9 +2,9 @@ from math import sqrt import numpy as np -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets here = osp.dirname(osp.abspath(__file__)) diff --git a/labelme/widgets/ai_prompt_widget.py b/labelme/widgets/ai_prompt_widget.py index c37c9ab95..9c5c46fec 100644 --- a/labelme/widgets/ai_prompt_widget.py +++ b/labelme/widgets/ai_prompt_widget.py @@ -1,4 +1,4 @@ -from qtpy import QtWidgets +from PyQt5 import QtWidgets class AiPromptWidget(QtWidgets.QWidget): diff --git a/labelme/widgets/brightness_contrast_dialog.py b/labelme/widgets/brightness_contrast_dialog.py index 47f5d8ec3..22864bd4a 100644 --- a/labelme/widgets/brightness_contrast_dialog.py +++ b/labelme/widgets/brightness_contrast_dialog.py @@ -1,8 +1,8 @@ import PIL.Image import PIL.ImageEnhance -from qtpy import QtWidgets -from qtpy.QtCore import Qt -from qtpy.QtGui import QImage +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QImage class BrightnessContrastDialog(QtWidgets.QDialog): diff --git a/labelme/widgets/canvas.py b/labelme/widgets/canvas.py index ddf707b5e..ff57c5dcb 100644 --- a/labelme/widgets/canvas.py +++ b/labelme/widgets/canvas.py @@ -2,9 +2,9 @@ import imgviz from loguru import logger -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets import labelme.ai import labelme.utils @@ -24,14 +24,14 @@ class Canvas(QtWidgets.QWidget): - zoomRequest = QtCore.Signal(int, QtCore.QPoint) - scrollRequest = QtCore.Signal(int, int) - newShape = QtCore.Signal() - selectionChanged = QtCore.Signal(list) - shapeMoved = QtCore.Signal() - drawingPolygon = QtCore.Signal(bool) - vertexSelected = QtCore.Signal(bool) - mouseMoved = QtCore.Signal(QtCore.QPointF) + zoomRequest = QtCore.pyqtSignal(int, QtCore.QPoint) + scrollRequest = QtCore.pyqtSignal(int, int) + newShape = QtCore.pyqtSignal() + selectionChanged = QtCore.pyqtSignal(list) + shapeMoved = QtCore.pyqtSignal() + drawingPolygon = QtCore.pyqtSignal(bool) + vertexSelected = QtCore.pyqtSignal(bool) + mouseMoved = QtCore.pyqtSignal(QtCore.QPointF) CREATE, EDIT = 0, 1 diff --git a/labelme/widgets/color_dialog.py b/labelme/widgets/color_dialog.py index f1590a3e1..5f4027c97 100644 --- a/labelme/widgets/color_dialog.py +++ b/labelme/widgets/color_dialog.py @@ -1,4 +1,4 @@ -from qtpy import QtWidgets +from PyQt5 import QtWidgets class ColorDialog(QtWidgets.QColorDialog): diff --git a/labelme/widgets/escapable_qlist_widget.py b/labelme/widgets/escapable_qlist_widget.py index 546934421..d4b3b3d05 100644 --- a/labelme/widgets/escapable_qlist_widget.py +++ b/labelme/widgets/escapable_qlist_widget.py @@ -1,5 +1,5 @@ -from qtpy import QtWidgets -from qtpy.QtCore import Qt +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt class EscapableQListWidget(QtWidgets.QListWidget): diff --git a/labelme/widgets/file_dialog_preview.py b/labelme/widgets/file_dialog_preview.py index 6110bcb18..af779d650 100644 --- a/labelme/widgets/file_dialog_preview.py +++ b/labelme/widgets/file_dialog_preview.py @@ -1,8 +1,8 @@ import json -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets class ScrollAreaPreview(QtWidgets.QScrollArea): diff --git a/labelme/widgets/label_dialog.py b/labelme/widgets/label_dialog.py index 78f3b4543..d4f6efcb5 100644 --- a/labelme/widgets/label_dialog.py +++ b/labelme/widgets/label_dialog.py @@ -1,9 +1,9 @@ import re from loguru import logger -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets import labelme.utils diff --git a/labelme/widgets/label_list_widget.py b/labelme/widgets/label_list_widget.py index 0011a9562..87402b8d9 100644 --- a/labelme/widgets/label_list_widget.py +++ b/labelme/widgets/label_list_widget.py @@ -1,9 +1,9 @@ -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets -from qtpy.QtCore import Qt -from qtpy.QtGui import QPalette -from qtpy.QtWidgets import QStyle +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPalette +from PyQt5.QtWidgets import QStyle # https://stackoverflow.com/a/2039745/4158863 @@ -93,7 +93,7 @@ def __repr__(self): class StandardItemModel(QtGui.QStandardItemModel): - itemDropped = QtCore.Signal() + itemDropped = QtCore.pyqtSignal() def removeRows(self, *args, **kwargs): ret = super().removeRows(*args, **kwargs) @@ -102,8 +102,8 @@ def removeRows(self, *args, **kwargs): class LabelListWidget(QtWidgets.QListView): - itemDoubleClicked = QtCore.Signal(LabelListWidgetItem) - itemSelectionChanged = QtCore.Signal(list, list) + itemDoubleClicked = QtCore.pyqtSignal(LabelListWidgetItem) + itemSelectionChanged = QtCore.pyqtSignal(list, list) def __init__(self): super(LabelListWidget, self).__init__() diff --git a/labelme/widgets/tool_bar.py b/labelme/widgets/tool_bar.py index a0087242c..c7ce8e338 100644 --- a/labelme/widgets/tool_bar.py +++ b/labelme/widgets/tool_bar.py @@ -1,5 +1,5 @@ -from qtpy import QtCore -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtWidgets class ToolBar(QtWidgets.QToolBar): diff --git a/labelme/widgets/unique_label_qlist_widget.py b/labelme/widgets/unique_label_qlist_widget.py index 19ef74812..2039ff666 100644 --- a/labelme/widgets/unique_label_qlist_widget.py +++ b/labelme/widgets/unique_label_qlist_widget.py @@ -2,8 +2,8 @@ import html -from qtpy import QtWidgets -from qtpy.QtCore import Qt +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt from .escapable_qlist_widget import EscapableQListWidget diff --git a/labelme/widgets/zoom_widget.py b/labelme/widgets/zoom_widget.py index 13fb2c253..c5567086a 100644 --- a/labelme/widgets/zoom_widget.py +++ b/labelme/widgets/zoom_widget.py @@ -1,6 +1,6 @@ -from qtpy import QtCore -from qtpy import QtGui -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtGui +from PyQt5 import QtWidgets class ZoomWidget(QtWidgets.QSpinBox): diff --git a/setup.py b/setup.py index 95b689ce6..663e21142 100644 --- a/setup.py +++ b/setup.py @@ -31,39 +31,11 @@ def get_install_requires(): "osam>=0.2.2", "Pillow>=2.8", "PyYAML", - "qtpy!=1.11.2", "scikit-image", "termcolor", + "PyQt5>=5.14.0", ] - # Find python binding for qt with priority: - # PyQt5 -> PySide2 - # and PyQt5 is automatically installed on Python3. - QT_BINDING = None - - try: - import PyQt5 # NOQA - - QT_BINDING = "pyqt5" - except ImportError: - pass - - if QT_BINDING is None: - try: - import PySide2 # NOQA - - QT_BINDING = "pyside2" - except ImportError: - pass - - if QT_BINDING is None: - # PyQt5 can be installed via pip for Python3 - # 5.15.3, 5.15.4 won't work with PyInstaller - install_requires.append("PyQt5!=5.15.3,!=5.15.4") - QT_BINDING = "pyqt5" - - del QT_BINDING - if os.name == "nt": # Windows install_requires.append("colorama") diff --git a/tests/labelme_tests/widgets_tests/test_label_dialog.py b/tests/labelme_tests/widgets_tests/test_label_dialog.py index aef525b6a..840bf6ecc 100644 --- a/tests/labelme_tests/widgets_tests/test_label_dialog.py +++ b/tests/labelme_tests/widgets_tests/test_label_dialog.py @@ -1,6 +1,6 @@ import pytest -from qtpy import QtCore -from qtpy import QtWidgets +from PyQt5 import QtCore +from PyQt5 import QtWidgets from labelme.widgets import LabelDialog from labelme.widgets import LabelQLineEdit