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 { return m_enum.keyToValue(key.toUtf8()); }
42 int keysToValue(const QString &keys) const override { return m_enum.keysToValue(keys.toUtf8()); }
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 { return charToQString(m_enum.valueToKey(value)); }
49 QString valueToKeys(int value) const override { return charToQString(m_enum.valueToKeys(value)); }
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 // ------- QDesignerMetaProperty
70 class QDesignerMetaProperty : public QDesignerMetaPropertyInterface {
71 public:
72 QDesignerMetaProperty(const QMetaProperty &property);
73 ~QDesignerMetaProperty() override;
74
75 const QDesignerMetaEnumInterface *enumerator() const override { return m_enumerator; }
76
77 Kind kind() const override { return m_kind; }
78
79 AccessFlags accessFlags() const override { return m_access; }
80 Attributes attributes() const override;
81
82 int type() const override { return m_property.metaType().id(); }
83 QString name() const override { return m_name; }
84 QString typeName() const override { return m_typeName; }
85 int userType() const override { return m_property.userType(); }
86 bool hasSetter() const override { return m_property.hasStdCppSet(); }
87
88 QVariant read(const QObject *object) const override { return m_property.read(object); }
89 bool reset(QObject *object) const override { return m_property.reset(object); }
90 bool write(QObject *object, const QVariant &value) const override { return m_property.write(object, value); }
91
92 private:
93 const QMetaProperty m_property;
94 const QString m_name;
95 const QString m_typeName;
96 Kind m_kind;
97 AccessFlags m_access;
98 Attributes m_defaultAttributes;
99 QDesignerMetaEnumInterface *m_enumerator;
100 };
101
102 QDesignerMetaProperty::QDesignerMetaProperty(const QMetaProperty &property) :
103 m_property(property),
104 m_name(charToQString(m_property.name())),
105 m_typeName(charToQString(m_property.typeName())),
106 m_kind(OtherKind),
107 m_enumerator(nullptr)
108 {
109 if (m_property.isFlagType() || m_property.isEnumType()) {
110 const QMetaEnum metaEnum = m_property.enumerator();
111 Q_ASSERT(metaEnum.isValid());
112 m_enumerator = new QDesignerMetaEnum(metaEnum);
113 }
114 // kind
115 if (m_property.isFlagType())
116 m_kind = FlagKind;
117 else
118 if (m_property.isEnumType())
119 m_kind = EnumKind;
120 // flags and attributes
121 if (m_property.isReadable())
122 m_access |= ReadAccess;
123 if (m_property.isWritable())
124 m_access |= WriteAccess;
125 if (m_property.isResettable())
126 m_access |= ResetAccess;
127
128 if (m_property.isDesignable())
129 m_defaultAttributes |= DesignableAttribute;
130 if (m_property.isScriptable())
131 m_defaultAttributes |= ScriptableAttribute;
132 if (m_property.isStored())
133 m_defaultAttributes |= StoredAttribute;
134 if (m_property.isUser())
135 m_defaultAttributes |= UserAttribute;
136 }
137
138 QDesignerMetaProperty::~QDesignerMetaProperty()
139 {
140 delete m_enumerator;
141 }
142
143 QDesignerMetaProperty::Attributes QDesignerMetaProperty::attributes() const
144 {
145 return m_defaultAttributes;
146 }
147
148 // -------------- QDesignerMetaMethod
149
150 class QDesignerMetaMethod : public QDesignerMetaMethodInterface {
151 public:
152 QDesignerMetaMethod(const QMetaMethod &method);
153
154 Access access() const override { return m_access; }
155 MethodType methodType() const override { return m_methodType; }
156 QStringList parameterNames() const override { return m_parameterNames; }
157 QStringList parameterTypes() const override { return m_parameterTypes; }
158 QString signature() const override { return m_signature; }
159 QString normalizedSignature() const override { return m_normalizedSignature; }
160 QString tag() const override { return m_tag; }
161 QString typeName() const override { return m_typeName; }
162
163 private:
164 Access m_access;
165 MethodType m_methodType;
166 const QStringList m_parameterNames;
167 const QStringList m_parameterTypes;
168 const QString m_signature;
169 const QString m_normalizedSignature;
170 const QString m_tag;
171 const QString m_typeName;
172 };
173
174 QDesignerMetaMethod::QDesignerMetaMethod(const QMetaMethod &method) :
175 m_parameterNames(byteArrayListToStringList(method.parameterNames())),
176 m_parameterTypes(byteArrayListToStringList(method.parameterTypes())),
177 m_signature(QString::fromLatin1(method.methodSignature())),
178 m_normalizedSignature(QString::fromLatin1(QMetaObject::normalizedSignature(method.methodSignature().constData()))),
179 m_tag(charToQString(method.tag())),
180 m_typeName(charToQString(method.typeName()))
181 {
182 switch (method.access()) {
183 case QMetaMethod::Public:
184 m_access = Public;
185 break;
186 case QMetaMethod::Protected:
187 m_access = Protected;
188 break;
189 case QMetaMethod::Private:
190 m_access = Private;
191 break;
192
193 }
194 switch (method.methodType()) {
195 case QMetaMethod::Constructor:
196 m_methodType = Constructor;
197 break;
198 case QMetaMethod::Method:
199 m_methodType = Method;
200 break;
201 case QMetaMethod::Signal:
202 m_methodType = Signal;
203 break;
204
205 case QMetaMethod::Slot:
206 m_methodType = Slot;
207 break;
208 }
209 }
210
211 // ------------- QDesignerMetaObject
212 class QDesignerMetaObject : public QDesignerMetaObjectInterface {
213 public:
214 QDesignerMetaObject(const qdesigner_internal::QDesignerIntrospection *introspection, const QMetaObject *metaObject);
215 ~QDesignerMetaObject() override;
216
217 QString className() const override { return m_className; }
218 const QDesignerMetaEnumInterface *enumerator(int index) const override
219 { return m_enumerators[index]; }
220 int enumeratorCount() const override { return m_enumerators.size(); }
221 int enumeratorOffset() const override { return m_metaObject->enumeratorOffset(); }
222
223 int indexOfEnumerator(const QString &name) const override
224 { return m_metaObject->indexOfEnumerator(name.toUtf8()); }
225 int indexOfMethod(const QString &method) const override
226 { return m_metaObject->indexOfMethod(method.toUtf8()); }
227 int indexOfProperty(const QString &name) const override
228 { return m_metaObject->indexOfProperty(name.toUtf8()); }
229 int indexOfSignal(const QString &signal) const override
230 { return m_metaObject->indexOfSignal(signal.toUtf8()); }
231 int indexOfSlot(const QString &slot) const override
232 { return m_metaObject->indexOfSlot(slot.toUtf8()); }
233
234 const QDesignerMetaMethodInterface *method(int index) const override
235 { return m_methods[index]; }
236 int methodCount() const override { return m_methods.size(); }
237 int methodOffset() const override { return m_metaObject->methodOffset(); }
238
239 const QDesignerMetaPropertyInterface *property(int index) const override
240 { return m_properties[index]; }
241 int propertyCount() const override { return m_properties.size(); }
242 int propertyOffset() const override { return m_metaObject->propertyOffset(); }
243
244 const QDesignerMetaObjectInterface *superClass() const override;
245 const QDesignerMetaPropertyInterface *userProperty() const override
246 { return m_userProperty; }
247
248 private:
249 const QString m_className;
250 const qdesigner_internal::QDesignerIntrospection *m_introspection;
251 const QMetaObject *m_metaObject;
252
253 using Enumerators = QList<QDesignerMetaEnumInterface *>;
254 Enumerators m_enumerators;
255
256 using Methods = QList<QDesignerMetaMethodInterface *>;
257 Methods m_methods;
258
259 using Properties = QList<QDesignerMetaPropertyInterface *>;
260 Properties m_properties;
261
262 QDesignerMetaPropertyInterface *m_userProperty;
263 };
264
265 QDesignerMetaObject::QDesignerMetaObject(const qdesigner_internal::QDesignerIntrospection *introspection, const QMetaObject *metaObject) :
266 m_className(charToQString(metaObject->className())),
267 m_introspection(introspection),
268 m_metaObject(metaObject),
269 m_userProperty(nullptr)
270 {
271 const int numEnumerators = metaObject->enumeratorCount();
272 m_enumerators.reserve(numEnumerators);
273 for (int i = 0; i < numEnumerators; i++)
274 m_enumerators.push_back(new QDesignerMetaEnum(metaObject->enumerator(i)));
275 const int numMethods = metaObject->methodCount();
276 m_methods.reserve(numMethods);
277 for (int i = 0; i < numMethods; i++)
278 m_methods.push_back(new QDesignerMetaMethod(metaObject->method(i)));
279
280 const int numProperties = metaObject->propertyCount();
281 m_properties.reserve(numProperties);
282 for (int i = 0; i < numProperties; i++)
283 m_properties.push_back(new QDesignerMetaProperty(metaObject->property(i)));
284
285 const QMetaProperty userProperty = metaObject->userProperty();
286 if (userProperty.isValid())
287 m_userProperty = new QDesignerMetaProperty(userProperty);
288 }
289
290 QDesignerMetaObject::~QDesignerMetaObject()
291 {
292 qDeleteAll(m_enumerators);
293 qDeleteAll(m_methods);
294 qDeleteAll(m_properties);
295 delete m_userProperty;
296 }
297
298 const QDesignerMetaObjectInterface *QDesignerMetaObject::superClass() const
299 {
300 const QMetaObject *qSuperClass = m_metaObject->superClass();
301 if (!qSuperClass)
302 return nullptr;
303 return m_introspection->metaObjectForQMetaObject(qSuperClass);
304 }
305
306}
307
308namespace qdesigner_internal {
309
311
316
321
329}
330
331QT_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)