eric6/Project/UicLoadUi6.py

changeset 7907
7991ea245c20
parent 7842
8fd1bd39e633
child 7923
91e843545d9a
equal deleted inserted replaced
7906:0af028b93cb3 7907:7991ea245c20
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2011 - 2020 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module to get the object name, class name or signatures of a Qt form (*.ui).
8 """
9
10 import os
11 import sys
12 import json
13 import xml.etree.ElementTree # secok
14
15 try:
16 from PyQt6.QtCore import QMetaMethod, QByteArray
17 from PyQt6.QtGui import QAction
18 from PyQt6.QtWidgets import QWidget, QApplication
19 from PyQt6 import uic
20 except ImportError:
21 print("PyQt6 could not be found.")
22 sys.exit(1)
23
24 try:
25 from PyQt5 import QtWebEngineWidgets # __IGNORE_WARNING__
26 except ImportError:
27 pass
28
29 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
30 # add the eric package directory
31
32
33 def objectName(formFile, projectPath):
34 """
35 Function to get the object name of a form.
36
37 @param formFile file name of the form
38 @type str
39 @param projectPath directory name of the project
40 @type str
41 """
42 app = QApplication([]) # __IGNORE_WARNING__
43 try:
44 dlg = uic.loadUi(formFile, package=projectPath)
45 print(dlg.objectName())
46 sys.exit(0)
47 except (AttributeError, ImportError,
48 xml.etree.ElementTree.ParseError) as err:
49 print(str(err))
50 sys.exit(1)
51
52
53 def className(formFile, projectPath):
54 """
55 Function to get the class name of a form.
56
57 @param formFile file name of the form
58 @type str
59 @param projectPath directory name of the project
60 @type str
61 """
62 app = QApplication([]) # __IGNORE_WARNING__
63 try:
64 dlg = uic.loadUi(formFile, package=projectPath)
65 print(dlg.metaObject().className())
66 sys.exit(0)
67 except (AttributeError, ImportError,
68 xml.etree.ElementTree.ParseError) as err:
69 print(str(err))
70 sys.exit(1)
71
72
73 def __mapType(type_):
74 """
75 Private function to map a type as reported by Qt's meta object to the
76 correct Python type.
77
78 @param type_ type as reported by Qt
79 @type QByteArray or bytes
80 @return mapped Python type
81 @rtype str
82 """
83 mapped = bytes(type_).decode()
84
85 # I. always check for *
86 mapped = mapped.replace("*", "")
87
88 # 1. check for const
89 mapped = mapped.replace("const ", "")
90
91 # 2. replace QString and QStringList
92 mapped = (
93 mapped
94 .replace("QStringList", "list")
95 .replace("QString", "str")
96 )
97
98 # 3. replace double by float
99 mapped = mapped.replace("double", "float")
100
101 return mapped
102
103
104 def signatures(formFile, projectPath):
105 """
106 Function to get the signatures of form elements.
107
108 @param formFile file name of the form
109 @type str
110 @param projectPath directory name of the project
111 @type str
112 """
113 objectsList = []
114
115 app = QApplication([]) # __IGNORE_WARNING__
116 try:
117 dlg = uic.loadUi(formFile, package=projectPath)
118 objects = dlg.findChildren(QWidget) + dlg.findChildren(QAction)
119 for obj in objects:
120 name = obj.objectName()
121 if not name or name.startswith("qt_"):
122 # ignore un-named or internal objects
123 continue
124
125 metaObject = obj.metaObject()
126 objectDict = {
127 "name": name,
128 "class_name": metaObject.className(),
129 "methods": [],
130 }
131
132 for index in range(metaObject.methodCount()):
133 metaMethod = metaObject.method(index)
134 if metaMethod.methodType() == QMetaMethod.MethodType.Signal:
135 signatureDict = {
136 "methods": []
137 }
138 signatureDict["signature"] = "on_{0}_{1}".format(
139 name,
140 bytes(metaMethod.methodSignature()).decode()
141 )
142
143 signatureDict["methods"].append("on_{0}_{1}".format(
144 name,
145 bytes(metaMethod.methodSignature())
146 .decode().split("(")[0]
147 ))
148 signatureDict["methods"].append("{0}({1})".format(
149 signatureDict["methods"][-1],
150 ", ".join([
151 __mapType(t)
152 for t in metaMethod.parameterTypes()
153 ])
154 ))
155
156 returnType = __mapType(
157 metaMethod.typeName().encode())
158 if returnType == 'void':
159 returnType = ""
160 signatureDict["return_type"] = returnType
161 parameterTypesList = [
162 __mapType(t)
163 for t in metaMethod.parameterTypes()
164 ]
165 signatureDict["parameter_types"] = parameterTypesList
166 pyqtSignature = ", ".join(parameterTypesList)
167 signatureDict["pyqt_signature"] = pyqtSignature
168
169 parameterNames = metaMethod.parameterNames()
170 if parameterNames:
171 for index in range(len(parameterNames)):
172 if not parameterNames[index]:
173 parameterNames[index] = QByteArray(
174 "p{0:d}".format(index).encode("utf-8")
175 )
176 parameterNamesList = [bytes(n).decode()
177 for n in parameterNames]
178 signatureDict["parameter_names"] = parameterNamesList
179 methNamesSig = ", ".join(parameterNamesList)
180
181 if methNamesSig:
182 pythonSignature = "on_{0}_{1}(self, {2})".format(
183 name,
184 bytes(metaMethod.methodSignature())
185 .decode().split("(")[0],
186 methNamesSig)
187 else:
188 pythonSignature = "on_{0}_{1}(self)".format(
189 name,
190 bytes(metaMethod.methodSignature())
191 .decode().split("(")[0])
192 signatureDict["python_signature"] = pythonSignature
193
194 objectDict["methods"].append(signatureDict)
195
196 objectsList.append(objectDict)
197
198 print(json.dumps(objectsList))
199 sys.exit(0)
200 except (AttributeError, ImportError,
201 xml.etree.ElementTree.ParseError) as err:
202 print(str(err))
203 sys.exit(1)
204
205
206 if __name__ == "__main__":
207 if len(sys.argv) != 4:
208 print("Wrong number of arguments.")
209 sys.exit(1)
210
211 if sys.argv[1] == "object_name":
212 objectName(sys.argv[2], sys.argv[3])
213 elif sys.argv[1] == "class_name":
214 className(sys.argv[2], sys.argv[3])
215 elif sys.argv[1] == "signatures":
216 signatures(sys.argv[2], sys.argv[3])
217 else:
218 print("Unknow operation given.")
219 sys.exit(1)
220
221 #
222 # eflag: noqa = M701, M801

eric ide

mercurial