28 if (object ==
nullptr)
31 QQuickTransition *transition = qobject_cast<QQuickTransition*>(object);
32 QQuickAbstractAnimation *animation = qobject_cast<QQuickAbstractAnimation*>(object);
33 QQmlTimer *timer = qobject_cast<QQmlTimer*>(object);
35 transition->setFromState(QString());
36 transition->setToState(QString());
37 }
else if (animation) {
41 animation->complete();
42 animation->setDisableUserControl();
44 timer->blockSignals(
true);
57 if (!object || objectList.contains(object))
60 objectList.append(object);
62 const QMetaObject *mo = object->metaObject();
64 QByteArrayList deferredPropertyNames;
65 const int namesIndex = mo->indexOfClassInfo(
"DeferredPropertyNames");
66 if (namesIndex != -1) {
67 QMetaClassInfo classInfo = mo->classInfo(namesIndex);
68 deferredPropertyNames = QByteArray(classInfo.value()).split(
',');
71 for (
int index = QObject::staticMetaObject.propertyOffset();
72 index < object->metaObject()->propertyCount();
75 QMetaProperty metaProperty = object->metaObject()->property(index);
77 if (deferredPropertyNames.contains(metaProperty.name()))
81 if (metaProperty.isReadable()
82 && metaProperty.isWritable()
83 && metaProperty.metaType().flags().testFlag(QMetaType::PointerToQObject)) {
84 if (qstrcmp(metaProperty.name(),
"parent")) {
85 QObject *propertyObject = QQmlMetaType::toQObject(metaProperty.read(object));
86 allSubObjects(propertyObject, objectList);
92 if (metaProperty.isReadable()
93 && QQmlMetaType::isList(metaProperty.metaType())) {
94 QQmlListReference list(object, metaProperty.name());
95 if (list.canCount() && list.canAt()) {
96 for (qsizetype i = 0; i < list.count(); i++) {
97 QObject *propertyObject = list.at(i);
98 allSubObjects(propertyObject, objectList);
106 for (QObject *childObject : object->children()) {
107 allSubObjects(childObject, objectList);
111 QQuickItem *quickItem = qobject_cast<QQuickItem*>(object);
113 const auto childItems = quickItem->childItems();
114 for (QQuickItem *childItem : childItems)
115 allSubObjects(childItem, objectList);
119void QQuickDesignerSupportItems::tweakObjects(QObject *object)
121 QObjectList objectList;
122 allSubObjects(object, objectList);
123 for (QObject* childObject : std::as_const(objectList)) {
124 stopAnimation(childObject);
125 makeLoaderSynchronous(childObject);
126 if (fixResourcePathsForObjectCallBack)
127 fixResourcePathsForObjectCallBack(childObject);
178QObject *QQuickDesignerSupportItems::createPrimitive(
const QString &typeName, QTypeRevision version, QQmlContext *context)
180 ComponentCompleteDisabler disableComponentComplete;
182 Q_UNUSED(disableComponentComplete);
184 QObject *object =
nullptr;
185 QQmlType type = QQmlMetaType::qmlType(typeName, version);
187 if (isCrashingType(type)) {
188 object =
new QObject;
189 }
else if (type.isValid()) {
190 if ( type.isComposite()) {
191 object = createComponent(type.sourceUrl(), context);
194 if (type.typeName() ==
"QQmlComponent") {
195 object =
new QQmlComponent(context->engine(),
nullptr);
197 object = type.create();
201 if (isWindow(object)) {
203 object = createDummyWindow(context->engine());
209 qWarning() <<
"QuickDesigner: Cannot create an object of type"
210 << QString::fromLatin1(
"%1 %2,%3").arg(typeName)
211 .arg(version.majorVersion()).arg(version.minorVersion())
212 <<
"- type isn't known to declarative meta type system";
215 tweakObjects(object);
217 if (object && QQmlEngine::contextForObject(object) ==
nullptr)
218 QQmlEngine::setContextForObject(object, context);
220 QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
225QObject *QQuickDesignerSupportItems::createComponent(
const QUrl &componentUrl, QQmlContext *context)
227 ComponentCompleteDisabler disableComponentComplete;
228 Q_UNUSED(disableComponentComplete);
230 QQmlComponent component(context->engine(), componentUrl);
232 QObject *object = component.beginCreate(context);
233 tweakObjects(object);
234 component.completeCreate();
235 QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
237 if (component.isError()) {
238 qWarning() <<
"Error in:" << Q_FUNC_INFO << componentUrl;
239 const auto errors = component.errors();
240 for (
const QQmlError &error : errors)
251void QQuickDesignerSupportItems::disableNativeTextRendering(QQuickItem *item)
253 QQuickText *text = qobject_cast<QQuickText*>(item);
255 text->setRenderType(QQuickText::QtRendering);
257 QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(item);
259 textInput->setRenderType(QQuickTextInput::QtRendering);
261 QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit*>(item);
263 textEdit->setRenderType(QQuickTextEdit::QtRendering);
266void QQuickDesignerSupportItems::disableTextCursor(QQuickItem *item)
268 const auto childItems = item->childItems();
269 for (QQuickItem *childItem : childItems)
270 disableTextCursor(childItem);
272 QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(item);
274 textInput->setCursorVisible(
false);
276 QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit*>(item);
278 textEdit->setCursorVisible(
false);
281void QQuickDesignerSupportItems::disableTransition(QObject *object)
283 QQuickTransition *transition = qobject_cast<QQuickTransition*>(object);
284 Q_ASSERT(transition);
285 const QString invalidState = QLatin1String(
"invalidState");
286 transition->setToState(invalidState);
287 transition->setFromState(invalidState);