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