Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdesigner_introspection.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant reason:default
4
6
7#include <QtCore/qobject.h>
8#include <QtCore/qlist.h>
9#include <QtCore/qmetaobject.h>
10#include <QtCore/qstringlist.h>
11
13
14using namespace Qt::StringLiterals;
15
16// Qt Implementation
17static QStringList byteArrayListToStringList(const QByteArrayList &l)
18{
19 if (l.isEmpty())
20 return QStringList();
21 QStringList rc;
22 for (const QByteArray &b : l)
23 rc += QString::fromUtf8(b);
24 return rc;
25}
26
27static inline QString charToQString(const char *c)
28{
29 if (!c)
30 return QString();
31 return QString::fromUtf8(c);
32}
33
34namespace {
35 // ------- QDesignerMetaEnum
36 class QDesignerMetaEnum : public QDesignerMetaEnumInterface {
37 public:
38 QDesignerMetaEnum(const QMetaEnum &qEnum);
39 bool isFlag() const override { return m_enum.isFlag(); }
40 QString key(int index) const override { return charToQString(m_enum.key(index)); }
41 int keyCount() const override { return m_enum.keyCount(); }
42 int keyToValue(const QString &key) const override;
43 int keysToValue(const QString &keys) const override;
44 QString name() const override { return m_name; }
45 QString enumName() const override { return charToQString(m_enum.enumName()); }
46 QString scope() const override { return m_scope; }
47 QString separator() const override;
48 int value(int index) const override { return m_enum.value(index); }
49 QString valueToKey(int value) const override;
50 QString valueToKeys(int value) const override;
51
52 private:
53 const QMetaEnum m_enum;
54 const QString m_name;
55 const QString m_scope;
56 };
57
58 QDesignerMetaEnum::QDesignerMetaEnum(const QMetaEnum &qEnum) :
59 m_enum(qEnum),
60 m_name(charToQString(m_enum.name())),
61 m_scope(charToQString(m_enum.scope()))
62 {
63 }
64
65 QString QDesignerMetaEnum::separator() const
66 {
67 return u"::"_s;
68 }
69
70 int QDesignerMetaEnum::keyToValue(const QString &key) const
71 {
72 return m_enum.keyToValue(key.toUtf8().constData());
73 }
74
75 int QDesignerMetaEnum::keysToValue(const QString &keys) const
76 {
77 return m_enum.keysToValue(keys.toUtf8().constData());
78 }
79
80 QString QDesignerMetaEnum::valueToKey(int value) const
81 {
82 return charToQString(m_enum.valueToKey(value));
83 }
84
85 QString QDesignerMetaEnum::valueToKeys(int value) const
86 {
87 return QString::fromUtf8(m_enum.valueToKeys(value));
88 }
89
90 // ------- QDesignerMetaProperty
91 class QDesignerMetaProperty : public QDesignerMetaPropertyInterface {
92 public:
93 QDesignerMetaProperty(const QMetaProperty &property);
94 ~QDesignerMetaProperty() override;
95
96 const QDesignerMetaEnumInterface *enumerator() const override { return m_enumerator; }
97
98 Kind kind() const override { return m_kind; }
99
100 AccessFlags accessFlags() const override { return m_access; }
101 Attributes attributes() const override;
102
103 int type() const override { return m_property.metaType().id(); }
104 QString name() const override { return m_name; }
105 QString typeName() const override { return m_typeName; }
106 int userType() const override { return m_property.userType(); }
107 bool hasSetter() const override { return m_property.hasStdCppSet(); }
108
109 QVariant read(const QObject *object) const override { return m_property.read(object); }
110 bool reset(QObject *object) const override { return m_property.reset(object); }
111 bool write(QObject *object, const QVariant &value) const override { return m_property.write(object, value); }
112
113 private:
114 const QMetaProperty m_property;
115 const QString m_name;
116 const QString m_typeName;
117 Kind m_kind;
118 AccessFlags m_access;
119 Attributes m_defaultAttributes;
120 QDesignerMetaEnumInterface *m_enumerator;
121 };
122
123 QDesignerMetaProperty::QDesignerMetaProperty(const QMetaProperty &property) :
124 m_property(property),
125 m_name(charToQString(m_property.name())),
126 m_typeName(charToQString(m_property.typeName())),
127 m_kind(OtherKind),
128 m_enumerator(nullptr)
129 {
130 if (m_property.isFlagType() || m_property.isEnumType()) {
131 const QMetaEnum metaEnum = m_property.enumerator();
132 Q_ASSERT(metaEnum.isValid());
133 m_enumerator = new QDesignerMetaEnum(metaEnum);
134 }
135 // kind
136 if (m_property.isFlagType())
137 m_kind = FlagKind;
138 else
139 if (m_property.isEnumType())
140 m_kind = EnumKind;
141 // flags and attributes
142 if (m_property.isReadable())
143 m_access |= ReadAccess;
144 if (m_property.isWritable())
145 m_access |= WriteAccess;
146 if (m_property.isResettable())
147 m_access |= ResetAccess;
148
149 if (m_property.isDesignable())
150 m_defaultAttributes |= DesignableAttribute;
151 if (m_property.isScriptable())
152 m_defaultAttributes |= ScriptableAttribute;
153 if (m_property.isStored())
154 m_defaultAttributes |= StoredAttribute;
155 if (m_property.isUser())
156 m_defaultAttributes |= UserAttribute;
157 }
158
159 QDesignerMetaProperty::~QDesignerMetaProperty()
160 {
161 delete m_enumerator;
162 }
163
164 QDesignerMetaProperty::Attributes QDesignerMetaProperty::attributes() const
165 {
166 return m_defaultAttributes;
167 }
168
169 // -------------- QDesignerMetaMethod
170
171 class QDesignerMetaMethod : public QDesignerMetaMethodInterface {
172 public:
173 QDesignerMetaMethod(const QMetaMethod &method);
174
175 Access access() const override { return m_access; }
176 MethodType methodType() const override { return m_methodType; }
177 QStringList parameterNames() const override { return m_parameterNames; }
178 QStringList parameterTypes() const override { return m_parameterTypes; }
179 QString signature() const override { return m_signature; }
180 QString normalizedSignature() const override { return m_normalizedSignature; }
181 QString tag() const override { return m_tag; }
182 QString typeName() const override { return m_typeName; }
183
184 private:
185 Access m_access;
186 MethodType m_methodType;
187 const QStringList m_parameterNames;
188 const QStringList m_parameterTypes;
189 const QString m_signature;
190 const QString m_normalizedSignature;
191 const QString m_tag;
192 const QString m_typeName;
193 };
194
195 QDesignerMetaMethod::QDesignerMetaMethod(const QMetaMethod &method) :
196 m_parameterNames(byteArrayListToStringList(method.parameterNames())),
197 m_parameterTypes(byteArrayListToStringList(method.parameterTypes())),
198 m_signature(QString::fromLatin1(method.methodSignature())),
199 m_normalizedSignature(QString::fromLatin1(QMetaObject::normalizedSignature(method.methodSignature().constData()))),
200 m_tag(charToQString(method.tag())),
201 m_typeName(charToQString(method.typeName()))
202 {
203 switch (method.access()) {
204 case QMetaMethod::Public:
205 m_access = Public;
206 break;
207 case QMetaMethod::Protected:
208 m_access = Protected;
209 break;
210 case QMetaMethod::Private:
211 m_access = Private;
212 break;
213
214 }
215 switch (method.methodType()) {
216 case QMetaMethod::Constructor:
217 m_methodType = Constructor;
218 break;
219 case QMetaMethod::Method:
220 m_methodType = Method;
221 break;
222 case QMetaMethod::Signal:
223 m_methodType = Signal;
224 break;
225
226 case QMetaMethod::Slot:
227 m_methodType = Slot;
228 break;
229 }
230 }
231
232 // ------------- QDesignerMetaObject
233 class QDesignerMetaObject : public QDesignerMetaObjectInterface {
234 public:
235 QDesignerMetaObject(const qdesigner_internal::QDesignerIntrospection *introspection, const QMetaObject *metaObject);
236 ~QDesignerMetaObject() override;
237
238 QString className() const override { return m_className; }
239 const QDesignerMetaEnumInterface *enumerator(int index) const override
240 { return m_enumerators[index]; }
241 int enumeratorCount() const override { return m_enumerators.size(); }
242 int enumeratorOffset() const override { return m_metaObject->enumeratorOffset(); }
243
244 int indexOfEnumerator(const QString &name) const override
245 { return m_metaObject->indexOfEnumerator(name.toUtf8().constData()); }
246 int indexOfMethod(const QString &method) const override
247 { return m_metaObject->indexOfMethod(method.toUtf8().constData()); }
248 int indexOfProperty(const QString &name) const override
249 { return m_metaObject->indexOfProperty(name.toUtf8().constData()); }
250 int indexOfSignal(const QString &signal) const override
251 { return m_metaObject->indexOfSignal(signal.toUtf8().constData()); }
252 int indexOfSlot(const QString &slot) const override
253 { return m_metaObject->indexOfSlot(slot.toUtf8().constData()); }
254
255 const QDesignerMetaMethodInterface *method(int index) const override
256 { return m_methods[index]; }
257 int methodCount() const override { return m_methods.size(); }
258 int methodOffset() const override { return m_metaObject->methodOffset(); }
259
260 const QDesignerMetaPropertyInterface *property(int index) const override
261 { return m_properties[index]; }
262 int propertyCount() const override { return m_properties.size(); }
263 int propertyOffset() const override { return m_metaObject->propertyOffset(); }
264
265 const QDesignerMetaObjectInterface *superClass() const override;
266 const QDesignerMetaPropertyInterface *userProperty() const override
267 { return m_userProperty; }
268
269 private:
270 const QString m_className;
271 const qdesigner_internal::QDesignerIntrospection *m_introspection;
272 const QMetaObject *m_metaObject;
273
274 using Enumerators = QList<QDesignerMetaEnumInterface *>;
275 Enumerators m_enumerators;
276
277 using Methods = QList<QDesignerMetaMethodInterface *>;
278 Methods m_methods;
279
280 using Properties = QList<QDesignerMetaPropertyInterface *>;
281 Properties m_properties;
282
283 QDesignerMetaPropertyInterface *m_userProperty;
284 };
285
286 QDesignerMetaObject::QDesignerMetaObject(const qdesigner_internal::QDesignerIntrospection *introspection, const QMetaObject *metaObject) :
287 m_className(charToQString(metaObject->className())),
288 m_introspection(introspection),
289 m_metaObject(metaObject),
290 m_userProperty(nullptr)
291 {
292 const int numEnumerators = metaObject->enumeratorCount();
293 m_enumerators.reserve(numEnumerators);
294 for (int i = 0; i < numEnumerators; i++)
295 m_enumerators.push_back(new QDesignerMetaEnum(metaObject->enumerator(i)));
296 const int numMethods = metaObject->methodCount();
297 m_methods.reserve(numMethods);
298 for (int i = 0; i < numMethods; i++)
299 m_methods.push_back(new QDesignerMetaMethod(metaObject->method(i)));
300
301 const int numProperties = metaObject->propertyCount();
302 m_properties.reserve(numProperties);
303 for (int i = 0; i < numProperties; i++)
304 m_properties.push_back(new QDesignerMetaProperty(metaObject->property(i)));
305
306 const QMetaProperty userProperty = metaObject->userProperty();
307 if (userProperty.isValid())
308 m_userProperty = new QDesignerMetaProperty(userProperty);
309 }
310
311 QDesignerMetaObject::~QDesignerMetaObject()
312 {
313 qDeleteAll(m_enumerators);
314 qDeleteAll(m_methods);
315 qDeleteAll(m_properties);
316 delete m_userProperty;
317 }
318
319 const QDesignerMetaObjectInterface *QDesignerMetaObject::superClass() const
320 {
321 const QMetaObject *qSuperClass = m_metaObject->superClass();
322 if (!qSuperClass)
323 return nullptr;
324 return m_introspection->metaObjectForQMetaObject(qSuperClass);
325 }
326
327}
328
329namespace qdesigner_internal {
330
332
337
342
350}
351
352QT_END_NAMESPACE
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static QString charToQString(const char *c)
static QStringList byteArrayListToStringList(const QByteArrayList &l)