]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
[bos #35148][EDF] (2023-T1) Evaluation of PySide. Update t_shape dialog and uic file... kleontev/35148_evaluation_of_pyside 13/head
authorKonstantin Leontev <Konstantin.LEONTEV@opencascade.com>
Tue, 28 Nov 2023 18:01:04 +0000 (18:01 +0000)
committerKonstantin Leontev <Konstantin.LEONTEV@opencascade.com>
Wed, 13 Dec 2023 11:05:11 +0000 (11:05 +0000)
CMakeLists.txt
src/Tools/t_shape/CMakeLists.txt
src/Tools/t_shape/t_shape_dialog.py
src/Tools/t_shape/t_shape_dialog.ui

index 062fa8eb8a50a520b0a13a7a3894354a85d5d715..5505dbd9c2c1307172841a56ae6ee85ca4d7994a 100644 (file)
@@ -66,6 +66,7 @@ OPTION(SALOME_BUILD_TESTS "Build SALOME tests" ON)
 
 # Advanced options:
 OPTION(SALOME_BUILD_GUI "Enable GUI" ON)
+OPTION(SALOME_USE_PYSIDE "Use PySide2 to create Python bindings for Qt" ON)
 CMAKE_DEPENDENT_OPTION(SALOME_GEOM_USE_OPENCV "Enable shape recognition from picture" OFF
                        "SALOME_BUILD_GUI" OFF)
 CMAKE_DEPENDENT_OPTION(SALOME_GEOM_USE_VTK "Enable VTK-dependent functionality" ON
index a7467634f32ba9e5c4c81175c0e4c1444ebf9855..013a194d629bdfc960898dd94a370d93062b8745 100644 (file)
@@ -43,7 +43,77 @@ IF(SALOME_BUILD_GUI)
     )
 
   # scripts / pyuic wrappings
-  PYQT_WRAP_UIC(_pyuic_SCRIPTS ${_pyuic_FILES} TARGET_NAME _target_name_pyuic)
+  IF(SALOME_USE_PYSIDE)
+
+    MESSAGE(STATUS "SALOME_USE_PYSIDE is defined. Start compilation with PySide2.")
+
+    # ========================== Find PySide2 uic compiler =================
+
+    # In Qt for Python 5.14.0 pyside2-uic/pyside2-rcc was replaced by uic/rcc
+    # which now have an option to generate Python.
+    # So, the stuff below will work only with Qt for Python >= 5.14.0
+    SET(uic_compiler_names
+      uic
+    )
+
+    SET(uic_compiler_hints
+      /usr/bin/uic
+    )
+
+    FIND_PROGRAM(uic_compiler NAMES ${uic_compiler_names} HINTS ${uic_compiler_hints})
+    IF(uic_compiler)
+      MESSAGE(STATUS "Found PySide2 uic tool: ${uic_compiler}")
+    ELSE()
+      MESSAGE(FATAL_ERROR "Couldn't find PySide2 uic tool!")
+    ENDIF()
+
+    # ========================== Generate Python class for each uic file =================
+
+    SET(_pyuic_SCRIPTS)
+    SET(_target_name_pyuic)
+    SET(uic_options -g python)
+
+    FOREACH(uic_infile ${_pyuic_FILES})
+
+        # Make a file name
+        GET_FILENAME_COMPONENT(uic_outfile ${uic_infile} NAME)
+        STRING(REPLACE ".ui" "_ui.py" uic_outfile ${uic_outfile})
+        SET(uic_outfile ${CMAKE_CURRENT_BINARY_DIR}/${uic_outfile})
+
+        # We need to use absolute path for a command
+        SET(uic_infile ${CMAKE_CURRENT_SOURCE_DIR}/${uic_infile})
+
+        SET(uic_command_options ${uic_options} -o ${uic_outfile} ${uic_infile})
+        MESSAGE(STATUS "uic_command_options: ${uic_command_options}")
+
+        # Create a command to call uic
+        ADD_CUSTOM_COMMAND(
+          OUTPUT ${uic_outfile}
+          COMMAND ${uic_compiler} ${uic_command_options}
+          MAIN_DEPENDENCY ${uic_infile}
+          VERBATIM
+        )
+
+        # Set additional properties
+        SET_SOURCE_FILES_PROPERTIES(${uic_infile} PROPERTIES SKIP_AUTOUIC ON)
+        SET_SOURCE_FILES_PROPERTIES(${uic_outfile} PROPERTIES SKIP_AUTOMOC ON)
+        SET_SOURCE_FILES_PROPERTIES(${uic_outfile} PROPERTIES SKIP_AUTOUIC ON)
+
+        # Save the result
+        LIST(APPEND _pyuic_SCRIPTS ${uic_outfile})
+        MESSAGE(STATUS "_pyuic_SCRIPTS: ${_pyuic_SCRIPTS}")
+
+        # Make target name the same way as for PyQt
+        _PYQT_WRAP_GET_UNIQUE_TARGET_NAME(BUILD_UI_PY_FILES _target_name_pyuic_cur)
+        ADD_CUSTOM_TARGET(${_target_name_pyuic_cur} ALL DEPENDS ${${_pyuic_SCRIPTS}})
+
+        LIST(APPEND _target_name_pyuic ${_target_name_pyuic_cur})
+
+    ENDFOREACH()
+
+  ELSE()
+    PYQT_WRAP_UIC(_pyuic_SCRIPTS ${_pyuic_FILES} TARGET_NAME _target_name_pyuic)
+  ENDIF()
 ENDIF()
 
 # --- rules ---
index 7278f43c5511130b5463ae576ca02c31107ef209..92ccbafc47781aee47492d5d9c89c41ccb28e034 100644 (file)
 # Author : Renaud Nédélec (OpenCascade S.A.S)
 
 import sys
-from qtsalome import *
+import os
+
+# PySide testing
+import SalomePyQt
+
+# Check if SalomePyQt uses PySide2
+use_pyside = False
+if hasattr(SalomePyQt, 'use_pyside'):
+  from PySide2.QtWidgets import QWidget, QApplication
+  use_pyside = True
+else:
+  from qtsalome import *
 
 from salome.geom.t_shape.t_shape_dialog_ui import Ui_Dialog
 
@@ -39,7 +50,32 @@ class TShapeDialog(Ui_Dialog,QWidget):
       self.dsb_smallRadius.setValue(40.0)
       self.dsb_bigHeight.setValue(80.0)
       self.dsb_smallHeight.setValue(80.0)
+
+      # PySide testing
+      self.dsb_getFileNameBtn.clicked.connect(self.get_file_name)
+      self.set_qt_bindings()
+
+    def get_file_name(self):
+      """
+      Updates displayed file name for testing PySide integration.
+      """
       
+      salome_py_qt = SalomePyQt.SalomePyQt()
+      filename = salome_py_qt.getFileName(self, os.path.expanduser("~"), [], self.tr("Testing getting a file name with PySide"), True)
+      if not filename:
+          return
+      
+      self.dsb_fileName.setText(filename)
+
+    def set_qt_bindings(self):
+      """
+      Returns a name of packaged that used for Qt bindings.
+      This function is only for testing PySide integration.
+      """
+
+      qt_bindings = 'PySide2' if use_pyside else 'PyQt5'
+      self.dsb_qt_bindings_value.setText(qt_bindings)
+
     def accept(self):
       from salome.geom.t_shape import t_shape_progress
       import xalome
@@ -72,6 +108,21 @@ class TShapeDialog(Ui_Dialog,QWidget):
       return self._wasOk
 
 __dialog=None
+
+def update_pyside(dialog):
+    """
+    This function updates displayed data for testing PySide integration.
+    """
+    salome_py_qt = SalomePyQt.SalomePyQt()
+
+    # Main frame width
+    main_frame_width = salome_py_qt.getMainFrame().width()
+    dialog.dsb_widthMainFrameValue.setText(str(main_frame_width))
+
+    # Components
+    components = salome_py_qt.getComponents()
+    dialog.dsb_components.addItems(components)
+
 def getDialog():
     """
     This function returns a singleton instance of the plugin dialog.
@@ -80,6 +131,8 @@ def getDialog():
     global __dialog
     if __dialog is None:
       __dialog = TShapeDialog()
+
+    update_pyside(__dialog)
     return __dialog
     
 # ================     
index 9bc0affe210d18843f44db6612191691dfc0ae48..b2913e02a977c3a2bbd77ff11b929b341421e5a5 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>349</width>
-    <height>283</height>
+    <height>524</height>
    </rect>
   </property>
   <property name="windowTitle">
      </item>
     </layout>
    </item>
+   <item row="3" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
    <item row="1" column="0">
     <layout class="QGridLayout" name="gridLayout_2">
-     <item row="0" column="0">
-      <widget class="QCheckBox" name="cb_buildSolid">
-       <property name="text">
-        <string>Build solid part</string>
-       </property>
-      </widget>
-     </item>
      <item row="1" column="0">
       <widget class="QLabel" name="label_5">
        <property name="text">
        </property>
       </widget>
      </item>
+     <item row="0" column="0">
+      <widget class="QCheckBox" name="cb_buildSolid">
+       <property name="text">
+        <string>Build solid part</string>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item row="2" column="0">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
+    <layout class="QGridLayout" name="gridLayout_PySide">
+     <item row="5" column="0" colspan="2">
+      <widget class="QListWidget" name="dsb_components"/>
+     </item>
+     <item row="7" column="0" colspan="2">
+      <widget class="QLabel" name="dsb_fileName">
+       <property name="text">
+        <string>Initial value</string>
+       </property>
+      </widget>
+     </item>
+     <item row="6" column="0" colspan="2">
+      <widget class="QPushButton" name="dsb_getFileNameBtn">
+       <property name="text">
+        <string>Get File Name</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="SalomePyQt_title">
+       <property name="text">
+        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:12pt; font-weight:600;&quot;&gt;SalomePyQt testing&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0" colspan="2">
+      <widget class="Line" name="line">
+       <property name="lineWidth">
+        <number>2</number>
+       </property>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="0">
+      <widget class="QLabel" name="widthMainFrameTitle">
+       <property name="text">
+        <string>Width main frame (px):</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <widget class="QLabel" name="dsb_widthMainFrameValue">
+       <property name="text">
+        <string>Initial value</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="0">
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Fixed</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item row="3" column="0">
+      <widget class="QLabel" name="qt_bindings_title">
+       <property name="text">
+        <string>Qt bindings package:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
+      <widget class="QLabel" name="dsb_qt_bindings_value">
+       <property name="text">
+        <string/>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
    </item>
   </layout>
  </widget>