eric6/Project/UicLoadUi6.py

changeset 7907
7991ea245c20
parent 7842
8fd1bd39e633
child 7923
91e843545d9a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Project/UicLoadUi6.py	Tue Dec 22 19:59:29 2020 +0100
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2011 - 2020 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module to get the object name, class name or signatures of a Qt form (*.ui).
+"""
+
+import os
+import sys
+import json
+import xml.etree.ElementTree            # secok
+
+try:
+    from PyQt6.QtCore import QMetaMethod, QByteArray
+    from PyQt6.QtGui import QAction
+    from PyQt6.QtWidgets import QWidget, QApplication
+    from PyQt6 import uic
+except ImportError:
+    print("PyQt6 could not be found.")
+    sys.exit(1)
+
+try:
+    from PyQt5 import QtWebEngineWidgets    # __IGNORE_WARNING__
+except ImportError:
+    pass
+
+sys.path.append(os.path.dirname(os.path.dirname(__file__)))
+# add the eric package directory
+
+
+def objectName(formFile, projectPath):
+    """
+    Function to get the object name of a form.
+    
+    @param formFile file name of the form
+    @type str
+    @param projectPath directory name of the project
+    @type str
+    """
+    app = QApplication([])      # __IGNORE_WARNING__
+    try:
+        dlg = uic.loadUi(formFile, package=projectPath)
+        print(dlg.objectName())
+        sys.exit(0)
+    except (AttributeError, ImportError,
+            xml.etree.ElementTree.ParseError) as err:
+        print(str(err))
+        sys.exit(1)
+
+
+def className(formFile, projectPath):
+    """
+    Function to get the class name of a form.
+    
+    @param formFile file name of the form
+    @type str
+    @param projectPath directory name of the project
+    @type str
+    """
+    app = QApplication([])      # __IGNORE_WARNING__
+    try:
+        dlg = uic.loadUi(formFile, package=projectPath)
+        print(dlg.metaObject().className())
+        sys.exit(0)
+    except (AttributeError, ImportError,
+            xml.etree.ElementTree.ParseError) as err:
+        print(str(err))
+        sys.exit(1)
+
+
+def __mapType(type_):
+    """
+    Private function to map a type as reported by Qt's meta object to the
+    correct Python type.
+    
+    @param type_ type as reported by Qt
+    @type QByteArray or bytes
+    @return mapped Python type
+    @rtype str
+    """
+    mapped = bytes(type_).decode()
+    
+    # I. always check for *
+    mapped = mapped.replace("*", "")
+    
+    # 1. check for const
+    mapped = mapped.replace("const ", "")
+    
+    # 2. replace QString and QStringList
+    mapped = (
+        mapped
+        .replace("QStringList", "list")
+        .replace("QString", "str")
+    )
+    
+    # 3. replace double by float
+    mapped = mapped.replace("double", "float")
+    
+    return mapped
+
+
+def signatures(formFile, projectPath):
+    """
+    Function to get the signatures of form elements.
+    
+    @param formFile file name of the form
+    @type str
+    @param projectPath directory name of the project
+    @type str
+    """
+    objectsList = []
+    
+    app = QApplication([])      # __IGNORE_WARNING__
+    try:
+        dlg = uic.loadUi(formFile, package=projectPath)
+        objects = dlg.findChildren(QWidget) + dlg.findChildren(QAction)
+        for obj in objects:
+            name = obj.objectName()
+            if not name or name.startswith("qt_"):
+                # ignore un-named or internal objects
+                continue
+            
+            metaObject = obj.metaObject()
+            objectDict = {
+                "name": name,
+                "class_name": metaObject.className(),
+                "methods": [],
+            }
+            
+            for index in range(metaObject.methodCount()):
+                metaMethod = metaObject.method(index)
+                if metaMethod.methodType() == QMetaMethod.MethodType.Signal:
+                    signatureDict = {
+                        "methods": []
+                    }
+                    signatureDict["signature"] = "on_{0}_{1}".format(
+                        name,
+                        bytes(metaMethod.methodSignature()).decode()
+                    )
+                    
+                    signatureDict["methods"].append("on_{0}_{1}".format(
+                        name,
+                        bytes(metaMethod.methodSignature())
+                        .decode().split("(")[0]
+                    ))
+                    signatureDict["methods"].append("{0}({1})".format(
+                        signatureDict["methods"][-1],
+                        ", ".join([
+                            __mapType(t)
+                            for t in metaMethod.parameterTypes()
+                        ])
+                    ))
+                    
+                    returnType = __mapType(
+                        metaMethod.typeName().encode())
+                    if returnType == 'void':
+                        returnType = ""
+                    signatureDict["return_type"] = returnType
+                    parameterTypesList = [
+                        __mapType(t)
+                        for t in metaMethod.parameterTypes()
+                    ]
+                    signatureDict["parameter_types"] = parameterTypesList
+                    pyqtSignature = ", ".join(parameterTypesList)
+                    signatureDict["pyqt_signature"] = pyqtSignature
+                    
+                    parameterNames = metaMethod.parameterNames()
+                    if parameterNames:
+                        for index in range(len(parameterNames)):
+                            if not parameterNames[index]:
+                                parameterNames[index] = QByteArray(
+                                    "p{0:d}".format(index).encode("utf-8")
+                                )
+                    parameterNamesList = [bytes(n).decode()
+                                          for n in parameterNames]
+                    signatureDict["parameter_names"] = parameterNamesList
+                    methNamesSig = ", ".join(parameterNamesList)
+                    
+                    if methNamesSig:
+                        pythonSignature = "on_{0}_{1}(self, {2})".format(
+                            name,
+                            bytes(metaMethod.methodSignature())
+                            .decode().split("(")[0],
+                            methNamesSig)
+                    else:
+                        pythonSignature = "on_{0}_{1}(self)".format(
+                            name,
+                            bytes(metaMethod.methodSignature())
+                            .decode().split("(")[0])
+                    signatureDict["python_signature"] = pythonSignature
+                    
+                    objectDict["methods"].append(signatureDict)
+            
+            objectsList.append(objectDict)
+        
+        print(json.dumps(objectsList))
+        sys.exit(0)
+    except (AttributeError, ImportError,
+            xml.etree.ElementTree.ParseError) as err:
+        print(str(err))
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    if len(sys.argv) != 4:
+        print("Wrong number of arguments.")
+        sys.exit(1)
+    
+    if sys.argv[1] == "object_name":
+        objectName(sys.argv[2], sys.argv[3])
+    elif sys.argv[1] == "class_name":
+        className(sys.argv[2], sys.argv[3])
+    elif sys.argv[1] == "signatures":
+        signatures(sys.argv[2], sys.argv[3])
+    else:
+        print("Unknow operation given.")
+        sys.exit(1)
+    
+#
+# eflag: noqa = M701, M801

eric ide

mercurial