Commit 505e00c7 authored by dmMaze's avatar dmMaze
Browse files

use qtpy

parent 7d9589c6
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -2,17 +2,26 @@ import sys
import argparse
import os.path as osp
import os
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QTranslator, QLocale
from ui.mainwindow import MainWindow
from ui.constants import PROGRAM_PATH

QT_APIS = ['pyqt5', 'pyqt6', 'pyside2', 'pyside6']

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--proj-dir", default='', type=str, help='Open project directory on startup')
    parser.add_argument("--qt-api", default='', choices=QT_APIS, help='Set qt api')
    args = parser.parse_args()

    if not args.qt_api in QT_APIS:
        os.environ['QT_API'] = 'pyqt5'
    else:
        os.environ['QT_API'] = args.qt_api

    from qtpy.QtWidgets import QApplication
    from qtpy.QtCore import QTranslator, QLocale

    from ui.mainwindow import MainWindow
    from ui.constants import PROGRAM_PATH

    os.chdir(PROGRAM_PATH)
    app = QApplication(sys.argv)
    translator = QTranslator()
+4 −7
Original line number Diff line number Diff line
import sys, os
sys.path.append(os.getcwd())


from PyQt5.QtCore import Qt, QRectF, QRect
from PyQt5.QtGui import QPixmap, QImage, QPainter, QFont, QColor

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from qtpy.QtCore import Qt, QRectF, QRect
from qtpy.QtGui import QPixmap, QImage, QPainter, QFont, QColor
from qtpy.QtWidgets import QApplication, QWidget

from ui.constants import DPI, LDPI
# PPI_LINUX
@@ -24,7 +21,7 @@ class MyWidget(QWidget):
        super().__init__()
        image = QImage(1000, 1000, QImage.Format_ARGB32)
        image.fill(Qt.GlobalColor.transparent)
        from PyQt5.QtGui import QGuiApplication
        from qtpy.QtGui import QGuiApplication
        DPI = QGuiApplication.primaryScreen().physicalDotsPerInch()
        LDPI = QGuiApplication.primaryScreen().logicalDotsPerInch()
        print(f'DPI: {DPI}, LDPI: {LDPI}')
+37 −31
Original line number Diff line number Diff line
import numpy as np
from PyQt5.QtWidgets import QMenu, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QUndoStack, QRubberBand
from PyQt5.QtCore import Qt, QRect, QRectF, QPointF, QPoint, pyqtSignal, QSizeF, QObject, QEvent
from PyQt5.QtGui import QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QPen, QPainterPath

from typing import List, Union, Tuple
from .misc import ndarray2pixmap, pixmap2ndarray, qrgb2bgr, ProjImgTrans

from qtpy.QtWidgets import QMenu, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QRubberBand
from qtpy.QtCore import Qt, QRect, QRectF, QPointF, QPoint, Signal, QSizeF, QObject, QEvent
from qtpy.QtGui import QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QPen, QPainterPath

try:
    from qtpy.QtWidgets import QUndoStack

except:
    from PyQt6.QtGui import QUndoStack

from .misc import ndarray2pixmap, ProjImgTrans
from .textitem import TextBlkItem, TextBlock
from .texteditshapecontrol import TextBlkShapeControl
from .stylewidgets import FadeLabel
from .image_edit import StrokeItem, PenStrokeItem, PenStrokeCommand, ImageEditMode
from .image_edit import StrokeItem, StrokeItem, ImageEditMode

CANVAS_SCALE_MAX = 3.0
CANVAS_SCALE_MIN = 0.1
@@ -18,11 +24,11 @@ CANVAS_SCALE_SPEED = 0.1
class CustomGV(QGraphicsView):
    do_scale = True
    ctrl_pressed = False
    scale_up_signal = pyqtSignal()
    scale_down_signal = pyqtSignal()
    view_resized = pyqtSignal()
    hide_canvas = pyqtSignal()
    ctrl_released = pyqtSignal()
    scale_up_signal = Signal()
    scale_down_signal = Signal()
    view_resized = Signal()
    hide_canvas = Signal()
    ctrl_released = Signal()

    def wheelEvent(self, event : QWheelEvent) -> None:
        # qgraphicsview always scroll content according to wheelevent
@@ -65,18 +71,18 @@ class CustomGV(QGraphicsView):

class Canvas(QGraphicsScene):

    scalefactor_changed = pyqtSignal()
    end_create_textblock = pyqtSignal(QRectF)
    end_create_rect = pyqtSignal(QRectF, int)
    finish_painting = pyqtSignal(StrokeItem)
    finish_erasing = pyqtSignal(StrokeItem)
    delete_textblks = pyqtSignal()
    format_textblks = pyqtSignal()
    scalefactor_changed = Signal()
    end_create_textblock = Signal(QRectF)
    end_create_rect = Signal(QRectF, int)
    finish_painting = Signal(StrokeItem)
    finish_erasing = Signal(StrokeItem)
    delete_textblks = Signal()
    format_textblks = Signal()

    begin_scale_tool = pyqtSignal(QPointF)
    scale_tool = pyqtSignal(QPointF)
    end_scale_tool = pyqtSignal()
    canvas_undostack_changed = pyqtSignal()
    begin_scale_tool = Signal(QPointF)
    scale_tool = Signal(QPointF)
    end_scale_tool = Signal()
    canvas_undostack_changed = Signal()
    
    imgtrans_proj: ProjImgTrans = None
    painting_pen = QPen()
@@ -85,7 +91,7 @@ class Canvas(QGraphicsScene):
    scale_tool_mode = False

    projstate_unsaved = False
    proj_savestate_changed = pyqtSignal(bool)
    proj_savestate_changed = Signal(bool)

    def __init__(self, parent=None):
        super().__init__(parent)
@@ -99,7 +105,7 @@ class Canvas(QGraphicsScene):
        self.hovering_textblkitem: TextBlkItem = None

        self.gv = CustomGV(self)
        self.gv.setAlignment(Qt.AlignCenter)
        self.gv.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.gv.setDragMode(QGraphicsView.DragMode.ScrollHandDrag)
        self.gv.scale_down_signal.connect(self.scaleDown)
        self.gv.scale_up_signal.connect(self.scaleUp)
@@ -116,7 +122,7 @@ class Canvas(QGraphicsScene):
        self.undoStack = QUndoStack(self)
        self.undoStack.indexChanged.connect(self.on_undostack_changed)
        self.scaleFactorLabel = FadeLabel(self.gv)
        self.scaleFactorLabel.setAlignment(Qt.AlignCenter)
        self.scaleFactorLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.scaleFactorLabel.setText('100%')
        self.scaleFactorLabel.gv = self.gv

@@ -245,7 +251,7 @@ class Canvas(QGraphicsScene):
    def startCreateTextblock(self, pos: QPointF, hide_control: bool = False):
        self.creating_textblock = True
        self.create_block_origin = pos
        self.gv.setCursor(Qt.CrossCursor)
        self.gv.setCursor(Qt.CursorShape.CrossCursor)
        self.txtblkShapeControl.setBlkItem(None)
        self.txtblkShapeControl.setPos(0, 0)
        self.txtblkShapeControl.setRotation(0)
@@ -256,7 +262,7 @@ class Canvas(QGraphicsScene):

    def endCreateTextblock(self, btn=0):
        self.creating_textblock = False
        self.gv.setCursor(Qt.ArrowCursor)
        self.gv.setCursor(Qt.CursorShape.ArrowCursor)
        self.txtblkShapeControl.hide()
        if self.creating_normal_rect:
            self.end_create_rect.emit(self.txtblkShapeControl.rect(), btn)
@@ -292,13 +298,13 @@ class Canvas(QGraphicsScene):
                self.scale_tool_mode = True
                self.begin_scale_tool.emit(event.scenePos())
            elif self.painting and self.stroke_path_item is None:
                self.stroke_path_item = PenStrokeItem(self.imgLayer.mapFromScene(event.scenePos()))
                self.stroke_path_item = StrokeItem(self.imgLayer.mapFromScene(event.scenePos()))
                self.addStrokeItem(self.stroke_path_item)

        elif event.button() == Qt.MouseButton.RightButton:
            # user is drawing using eraser
            if self.painting and self.stroke_path_item is None:
                self.stroke_path_item = PenStrokeItem(self.imgLayer.mapFromScene(event.scenePos()))
                self.stroke_path_item = StrokeItem(self.imgLayer.mapFromScene(event.scenePos()))
                self.addStrokeItem(self.stroke_path_item)
            else:   # rubber band selection
                self.rubber_band_origin = event.scenePos()
@@ -316,7 +322,7 @@ class Canvas(QGraphicsScene):
        if self.creating_textblock:
            btn = 0 if event.button() == Qt.MouseButton.LeftButton else 1
            return self.endCreateTextblock(btn=btn)
        elif event.button() == Qt.RightButton:
        elif event.button() == Qt.MouseButton.RightButton:
            if self.stroke_path_item is not None:
                self.finish_erasing.emit(self.stroke_path_item)
            if self.rubber_band.isVisible():
+10 −10
Original line number Diff line number Diff line
from PyQt5.QtWidgets import QLayout, QHBoxLayout, QVBoxLayout, QTreeView, QPlainTextEdit, QWidget, QFileDialog, QLabel, QSizePolicy, QComboBox, QListView, QToolBar, QMenu, QSpacerItem, QPushButton, QAction, QCheckBox, QToolButton, QSplitter, QStylePainter, QStyleOption, QStyle, QScrollArea, QLineEdit, QGroupBox, QGraphicsSimpleTextItem
from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal, QPointF, QPoint, QSize, QSizeF, QObject, QEvent
from PyQt5.QtGui import QStandardItem, QStandardItemModel, QMouseEvent, QCloseEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QTextFrame, QTransform, QTextBlock, QAbstractTextDocumentLayout, QTextLayout, QFont, QFontMetrics, QTextOption, QTextLine, QPen, QColor, QTextFormat, QTextCursor, QPalette, QTextDocument
from qtpy.QtWidgets import QLayout, QHBoxLayout, QVBoxLayout, QTreeView, QWidget, QLabel, QSizePolicy, QSpacerItem, QCheckBox, QSplitter, QScrollArea, QGroupBox
from qtpy.QtCore import Qt, QModelIndex, Signal, QSize
from qtpy.QtGui import QStandardItem, QStandardItemModel, QMouseEvent, QFont, QColor, QPalette
from PyQt5 import QtCore
from typing import List, Union, Tuple

@@ -27,7 +27,7 @@ class ConfigTextLabel(QLabel):


class ConfigSubBlock(Widget):
    pressed = pyqtSignal(int, int)
    pressed = Signal(int, int)
    def __init__(self, widget: Union[QWidget, QLayout], name: str = None, discription: str = None, vertical_layout=True) -> None:
        super().__init__()
        self.idx0: int = None
@@ -58,7 +58,7 @@ class ConfigSubBlock(Widget):


class ConfigBlock(Widget):
    sublock_pressed = pyqtSignal(int, int)
    sublock_pressed = Signal(int, int)
    def __init__(self, header: str, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        self.header = ConfigTextLabel(header, CONFIG_FONTSIZE_HEADER)
@@ -119,11 +119,11 @@ class ConfigContent(QScrollArea):
        super().__init__(*args, **kwargs)
        self.config_block_list: List[ConfigBlock] = []
        self.scrollContent = QGroupBox()
        self.setAlignment(Qt.AlignLeft | Qt.AlignTop)
        self.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop)
        self.setWidget(self.scrollContent)
        vlayout = QVBoxLayout()
        vlayout.setContentsMargins(32, 0, 0, 0)
        vlayout.setAlignment(Qt.AlignTop)
        vlayout.setAlignment(Qt.AlignmentFlag.AlignTop)
        self.scrollContent.setLayout(vlayout)
        self.setWidgetResizable(True)
        self.vlayout = vlayout
@@ -169,7 +169,7 @@ class TreeModel(QStandardItemModel):
    def data(self, index, role):
        if not index.isValid():
            return None
        if role == Qt.SizeHintRole:
        if role == Qt.ItemDataRole.SizeHintRole:
            size = QSize()
            item = self.itemFromIndex(index)
            size.setHeight(item.font().pointSize()+40)
@@ -179,7 +179,7 @@ class TreeModel(QStandardItemModel):


class ConfigTable(QTreeView):
    tableitem_pressed = pyqtSignal(int, int)
    tableitem_pressed = Signal(int, int)
    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)

@@ -299,7 +299,7 @@ class ConfigPanel(Widget):
        self.let_fntcolor_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('font & stroke color'))
        self.let_fntcolor_combox.currentIndexChanged.connect(self.on_fontcolor_flag_changed)

        splitter = QSplitter(Qt.Horizontal)
        splitter = QSplitter(Qt.Orientation.Horizontal)
        splitter.addWidget(self.configTable)
        splitter.addWidget(self.configContent)
        splitter.setStretchFactor(0, 1)
+7 −7
Original line number Diff line number Diff line
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QPixmap
from PyQt5.QtGui import QCursor
from qtpy.QtCore import Qt
from qtpy.QtGui import QPixmap, QPixmap
from qtpy.QtGui import QCursor
from functools import cached_property


@@ -41,9 +41,9 @@ class RotateCursorList:
        return self.__getattribute__('Cursor' + str(idx))
        
resizeCursorList = [
    Qt.SizeFDiagCursor, 
    Qt.SizeVerCursor, 
    Qt.SizeBDiagCursor, 
    Qt.SizeHorCursor
    Qt.CursorShape.SizeFDiagCursor, 
    Qt.CursorShape.SizeVerCursor, 
    Qt.CursorShape.SizeBDiagCursor, 
    Qt.CursorShape.SizeHorCursor
]
rotateCursorList = RotateCursorList()
 No newline at end of file
Loading