eric6/Project/UicLoadUi5.py

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

eric ide

mercurial