Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickpropertychanges.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <private/qqmlopenmetaobject_p.h>
7#include <private/qqmlengine_p.h>
8
9#include <qqmlinfo.h>
10#include <private/qqmlcustomparser_p.h>
11#include <qqmlexpression.h>
12#include <private/qqmlbinding_p.h>
13#include <qqmlcontext.h>
14#include <private/qqmlproperty_p.h>
15#include <private/qqmlcontext_p.h>
16#include <private/qquickstate_p_p.h>
17#include <private/qqmlboundsignal_p.h>
18#include <private/qv4qmlcontext_p.h>
19#include <private/qqmlpropertybinding_p.h>
20#include <private/qqmlirbuilder_p.h>
21
22#include <QtCore/qdebug.h>
23#include <QtQml/private/qqmlsignalnames_p.h>
24
25#include <private/qobject_p.h>
26#include <QtCore/qpointer.h>
27
29
118{
119public:
122
123 EventType type() const override { return SignalHandler; }
124
126 QQmlRefPointer<QQmlBoundSignalExpression> expression;
127 QQmlRefPointer<QQmlBoundSignalExpression> reverseExpression;
128 QQmlRefPointer<QQmlBoundSignalExpression> rewindExpression;
129
133
134 bool isReversable() override { return true; }
138
143
144 bool needsCopy() override { return true; }
146 {
149 if (rsh == this)
150 return;
151 reverseExpression = rsh->reverseExpression;
152 }
153
160
162 if (other == this)
163 return true;
164 if (other->type() != type())
165 return false;
166 if (static_cast<QQuickReplaceSignalHandler*>(other)->property == property)
167 return true;
168 return false;
169 }
170};
171
172
174{
175 Q_DECLARE_PUBLIC(QQuickPropertyChanges)
176public:
179
180 QPointer<QObject> object;
181 QList<const QV4::CompiledData::Binding *> bindings;
182 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
183
184 bool decoded : 1;
185 bool restore : 1;
186 bool isExplicit : 1;
187
188 void decode();
189 void decodeBinding(const QString &propertyPrefix, const QQmlRefPointer<QV4::ExecutableCompilationUnit> &qmlUnit, const QV4::CompiledData::Binding *binding);
190
192 public:
194 const QV4::CompiledData::Binding *_binding,
196 const QString& _expr,
197 const QUrl &_url,
198 int _line,
199 int _column)
200 : name(_name), binding(_binding), id(_id), expression(_expr), url(_url), line(_line), column(_column) {}
206 int line;
208 };
209
210 QList<QPair<QString, QVariant> > properties;
211 QList<ExpressionChange> expressions;
212 QList<QQuickReplaceSignalHandler*> signalReplacements;
213
215};
216
217void QQuickPropertyChangesParser::verifyList(const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, const QV4::CompiledData::Binding *binding)
218{
219 switch (binding->type()) {
221 error(compilationUnit->objectAt(binding->value.objectIndex),
222 QQuickPropertyChanges::tr(
223 "PropertyChanges does not support creating state-specific objects."));
224 break;
227 const QV4::CompiledData::Object *subObj = compilationUnit->objectAt(binding->value.objectIndex);
228 const QV4::CompiledData::Binding *subBinding = subObj->bindingTable();
229 for (quint32 i = 0; i < subObj->nBindings; ++i, ++subBinding)
230 verifyList(compilationUnit, subBinding);
231 break;
232 }
233 default:
234 break;
235 }
236}
237
239{
240 if (decoded)
241 return;
242
243 for (const QV4::CompiledData::Binding *binding : std::as_const(bindings))
245
246 bindings.clear();
247
248 decoded = true;
249}
250
251void QQuickPropertyChangesPrivate::decodeBinding(const QString &propertyPrefix, const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, const QV4::CompiledData::Binding *binding)
252{
254
255 QString propertyName = propertyPrefix + compilationUnit->stringAt(binding->propertyNameIndex);
256
257 switch (binding->type()) {
260 QString pre = propertyName + QLatin1Char('.');
261 const QV4::CompiledData::Object *subObj = compilationUnit->objectAt(binding->value.objectIndex);
262 const QV4::CompiledData::Binding *subBinding = subObj->bindingTable();
263 for (quint32 i = 0; i < subObj->nBindings; ++i, ++subBinding) {
264 decodeBinding(pre, compilationUnit, subBinding);
265 }
266 return;
267 }
268 default:
269 break;
270 }
271
272 if (binding->isSignalHandler() || QQmlSignalNames::isHandlerName(propertyName)) {
273 QQmlProperty prop = property(propertyName);
274 if (prop.isSignalProperty()) {
276 handler->property = prop;
277 handler->expression.adopt(
279 prop.object(), QQmlPropertyPrivate::get(prop)->signalIndex(),
281 compilationUnit->runtimeFunctions.at(binding->value.compiledScriptIndex)));
282 signalReplacements << handler;
283 return;
284 }
285 }
286
288 || binding->isTranslationBinding()) {
289 QUrl url = QUrl();
290 int line = -1;
291 int column = -1;
292
293 QQmlData *ddata = QQmlData::get(q);
294 if (ddata && ddata->outerContext && !ddata->outerContext->url().isEmpty()) {
295 url = ddata->outerContext->url();
296 line = ddata->lineNumber;
297 column = ddata->columnNumber;
298 }
299
300 QString expression;
302
303 if (!binding->isTranslationBinding()) {
304 expression = compilationUnit->bindingValueAsString(binding);
305 id = binding->value.compiledScriptIndex;
306 }
307 expressions << ExpressionChange(propertyName, binding, id, expression, url, line, column);
308 return;
309 }
310
312 switch (binding->type()) {
316 Q_UNREACHABLE();
319 break;
322 break;
324 var = binding->valueAsBoolean();
325 break;
327 var = QVariant::fromValue(nullptr);
328 break;
329 default:
330 break;
331 }
332
333 properties << qMakePair(propertyName, var);
334}
335
336void QQuickPropertyChangesParser::verifyBindings(const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, const QList<const QV4::CompiledData::Binding *> &props)
337{
338 for (int ii = 0; ii < props.size(); ++ii)
339 verifyList(compilationUnit, props.at(ii));
340}
341
342void QQuickPropertyChangesParser::applyBindings(QObject *obj, const QQmlRefPointer<QV4::ExecutableCompilationUnit> &compilationUnit, const QList<const QV4::CompiledData::Binding *> &bindings)
343{
346 p->bindings = bindings;
347 p->compilationUnit = compilationUnit;
348 p->decoded = false;
349
351 Q_ASSERT(data && !data->wasDeleted(obj));
352 data->releaseDeferredData();
353}
354
359
361{
363 for(int ii = 0; ii < d->signalReplacements.size(); ++ii)
364 delete d->signalReplacements.at(ii);
365}
366
368{
369 Q_D(const QQuickPropertyChanges);
370 return d->object;
371}
372
374{
376 if (o != d->object) {
377 d->object = o;
379 }
380}
381
392{
393 Q_D(const QQuickPropertyChanges);
394 return d->restore;
395}
396
398{
400 if (v != d->restore) {
401 d->restore = v;
403 }
404}
405
408{
410 QQmlData *ddata = QQmlData::get(q);
412 object, property, ddata ? ddata->outerContext : QQmlRefPointer<QQmlContextData>(),
414 if (!prop.isValid()) {
415 qmlWarning(q) << QQuickPropertyChanges::tr("Cannot assign to non-existent property \"%1\"").arg(property);
416 return QQmlProperty();
417 } else if (!(prop.type() & QQmlProperty::SignalProperty) && !prop.isWritable()) {
418 qmlWarning(q) << QQuickPropertyChanges::tr("Cannot assign to read-only property \"%1\"").arg(property);
419 return QQmlProperty();
420 }
421 return prop;
422}
423
425{
427
428 d->decode();
429
431
432 for (int ii = 0; ii < d->properties.size(); ++ii) {
433 QQmlProperty prop = d->property(d->properties.at(ii).first);
434
435 QQuickStateAction a(d->object, prop, d->properties.at(ii).first,
436 d->properties.at(ii).second);
437
438 if (a.property.isValid()) {
439 a.restore = restoreEntryValues();
440 list << a;
441 }
442 }
443
444 for (int ii = 0; ii < d->signalReplacements.size(); ++ii) {
445 QQuickReplaceSignalHandler *handler = d->signalReplacements.at(ii);
446
447 if (handler->property.isValid()) {
449 a.event = handler;
450 list << a;
451 }
452 }
453
454 for (int ii = 0; ii < d->expressions.size(); ++ii) {
455
457 const QString &property = e.name;
459
460 if (prop.isValid()) {
463 a.property = prop;
464 a.fromValue = a.property.read();
465 a.specifiedObject = d->object;
466 a.specifiedProperty = property;
467
468 QQmlRefPointer<QQmlContextData> context = QQmlContextData::get(qmlContext(this));
469 QV4::Scope scope(qmlEngine(this)->handle());
471
472 if (d->isExplicit) {
473 // in this case, we don't want to assign a binding, per se,
474 // so we evaluate the expression and assign the result.
475 // XXX TODO: add a static QQmlJavaScriptExpression::evaluate(QString)
476 // so that we can avoid creating then destroying the binding in this case.
477 std::unique_ptr<QQmlBinding> newBinding = nullptr;
478 if (e.binding && e.binding->isTranslationBinding()) {
479 newBinding.reset(QQmlBinding::createTranslationBinding(d->compilationUnit, e.binding, object(), context));
480 } else if (e.id != QQmlBinding::Invalid) {
481 newBinding.reset(QQmlBinding::create(&QQmlPropertyPrivate::get(prop)->core, d->compilationUnit->runtimeFunctions.at(e.id), object(), context, qmlCtxt));
482 } else {
483 newBinding.reset(QQmlBinding::create(&QQmlPropertyPrivate::get(prop)->core, e.expression, object(), context, e.url.toString(), e.line));
484 }
485 a.toValue = newBinding->evaluate();
486 } else {
487 QQmlAnyBinding newBinding = nullptr;
488 if (e.binding && e.binding->isTranslationBinding()) {
489 newBinding = QQmlAnyBinding::createTranslationBinding(prop, d->compilationUnit, e.binding, object(), context);
490 } else if (e.id != QQmlBinding::Invalid) {
491 newBinding = QQmlAnyBinding::createFromFunction(prop,
492 d->compilationUnit->runtimeFunctions.at(e.id),
493 object(), context, qmlCtxt);
494 } else {
495 newBinding = QQmlAnyBinding::createFromCodeString(prop, e.expression, object(), context, e.url.toString(), e.line);
496 }
497
498 a.toBinding = newBinding;
499 a.deletableToBinding = true;
500 }
501
502 list << a;
503 }
504 }
505
506 return list;
507}
508
529{
530 Q_D(const QQuickPropertyChanges);
531 return d->isExplicit;
532}
533
535{
537 if (e != d->isExplicit) {
538 d->isExplicit = e;
540 }
541}
542
544{
545 Q_D(const QQuickPropertyChanges);
546 typedef QPair<QString, QVariant> PropertyEntry;
547
548 for (const PropertyEntry &entry : d->properties) {
549 if (entry.first == name) {
550 return true;
551 }
552 }
553
554 return false;
555}
556
558{
559 Q_D(const QQuickPropertyChanges);
561
562 for (const ExpressionEntry &entry : d->expressions) {
563 if (entry.name == name) {
564 return true;
565 }
566 }
567
568 return false;
569}
570
575
577{
579 typedef QPair<QString, QVariant> PropertyEntry;
580
581 for (auto it = d->expressions.begin(), end = d->expressions.end(); it != end; ++it) {
582 if (it->name == name) {
583 d->expressions.erase(it);
584 if (state() && state()->isStateActive()) {
586 d->property(name).write(value);
587 }
588
589 d->properties.append(PropertyEntry(name, value));
590 return;
591 }
592 }
593
594 for (auto it = d->properties.begin(), end = d->properties.end(); it != end; ++it) {
595 if (it->first == name) {
596 it->second = value;
597 if (state() && state()->isStateActive())
598 d->property(name).write(value);
599 return;
600 }
601 }
602
603 QQuickStateAction action;
604 action.restore = restoreEntryValues();
605 action.property = d->property(name);
606 action.fromValue = action.property.read();
607 action.specifiedObject = object();
608 action.specifiedProperty = name;
609 action.toValue = value;
610
611 d->properties.append(PropertyEntry(name, value));
612 if (state() && state()->isStateActive()) {
613 state()->addEntryToRevertList(action);
615 if (oldBinding)
617 d->property(name).write(value);
618 }
619}
620
622{
625
626 bool hadValue = false;
627
628 for (auto it = d->properties.begin(), end = d->properties.end(); it != end; ++it) {
629 if (it->first == name) {
630 d->properties.erase(it);
631 hadValue = true;
632 break;
633 }
634 }
635
636 for (auto it = d->expressions.begin(), end = d->expressions.end(); it != end; ++it) {
637 if (it->name == name) {
638 it->expression = expression;
639 if (state() && state()->isStateActive()) {
640 auto prop = d->property(name);
642 QString url;
643 int lineNumber = 0;
644 QQmlAnyBinding::createFromCodeString(prop, expression, object(), context, url, lineNumber).installOn(prop);
645 }
646 return;
647 }
648 }
649
650 // adding a new expression.
651 d->expressions.append(ExpressionEntry(name, nullptr, QQmlBinding::Invalid, expression, QUrl(), -1, -1));
652
653 const QString url;
654 const quint16 lineNumber = 0;
655 if (state() && state()->isStateActive()) {
656 if (hadValue) {
657 auto prop = d->property(name);
658 QQmlAnyBinding oldBinding = QQmlAnyBinding::takeFrom(prop);
659 if (oldBinding)
660 state()->changeBindingInRevertList(object(), name, oldBinding);
661
662 QQmlAnyBinding::createFromCodeString(prop, expression, object(), QQmlContextData::get(qmlContext(this)), url, lineNumber).installOn(prop);
663 } else {
664 QQuickStateAction action;
665 action.restore = restoreEntryValues();
666 action.property = d->property(name);
667 action.fromValue = action.property.read();
668 action.specifiedObject = object();
669 action.specifiedProperty = name;
670
671 QQmlAnyBinding newBinding;
672 if (d->isExplicit) {
673 newBinding = QQmlBinding::create(
675 object(), QQmlContextData::get(qmlContext(this)));
676 } else {
677 const auto prop = action.property;
678 const auto context = QQmlContextData::get(qmlContext(this));
679 newBinding = QQmlAnyBinding::createFromCodeString(prop, expression, object(), context, url, lineNumber);
680 }
681 if (d->isExplicit) {
682 // don't assign the binding, merely evaluate the expression.
683 // XXX TODO: add a static QQmlJavaScriptExpression::evaluate(QString)
684 // so that we can avoid creating then destroying the binding in this case.
685 action.toValue = static_cast<QQmlBinding *>(newBinding.asAbstractBinding())->evaluate();
686 } else {
687 // TODO: replace binding would be more efficient for new-style properties
689 newBinding.installOn(action.property);
690 action.toBinding = newBinding;
691 action.deletableToBinding = true;
692 state()->addEntryToRevertList(action);
693 }
694 }
695 }
696 // what about the signal handler?
697}
698
700{
701 Q_D(const QQuickPropertyChanges);
702 typedef QPair<QString, QVariant> PropertyEntry;
704
705 for (const PropertyEntry &entry : d->properties) {
706 if (entry.first == name) {
707 return entry.second;
708 }
709 }
710
711 for (const ExpressionEntry &entry : d->expressions) {
712 if (entry.name == name) {
713 return QVariant(entry.expression);
714 }
715 }
716
717 return QVariant();
718}
719
721{
723
724 for (auto it = d->expressions.begin(), end = d->expressions.end(); it != end; ++it) {
725 if (it->name == name) {
726 d->expressions.erase(it);
728 return;
729 }
730 }
731
732 for (auto it = d->properties.begin(), end = d->properties.end(); it != end; ++it) {
733 if (it->first == name) {
734 d->properties.erase(it);
736 return;
737 }
738 }
739}
740
742{
743 Q_D(const QQuickPropertyChanges);
744 typedef QPair<QString, QVariant> PropertyEntry;
745
746 for (const PropertyEntry &entry : d->properties) {
747 if (entry.first == name) {
748 return entry.second;
749 }
750 }
751
752 return QVariant();
753}
754
756{
757 Q_D(const QQuickPropertyChanges);
759
760 for (const ExpressionEntry &entry : d->expressions) {
761 if (entry.name == name) {
762 return entry.expression;
763 }
764 }
765
766 return QString();
767}
768
774
780
782
783#include "moc_qquickpropertychanges_p.cpp"
void clear()
Definition qlist.h:434
QVariant read(const QObject *obj) const
Reads the property's value from the given object.
static QObjectPrivate * get(QObject *o)
Definition qobject_p.h:150
\inmodule QtCore
Definition qobject.h:103
QQmlAnyBinding is an abstraction over the various bindings in QML.
static QQmlAnyBinding createFromCodeString(const QQmlProperty &prop, const QString &code, QObject *obj, const QQmlRefPointer< QQmlContextData > &ctxt, const QString &url, quint16 lineNumber)
static void removeBindingFrom(QQmlProperty &prop)
static QQmlAnyBinding createTranslationBinding(const QQmlProperty &prop, const QQmlRefPointer< QV4::ExecutableCompilationUnit > &compilationUnit, const QV4::CompiledData::Binding *translationBinding, QObject *scopeObject=nullptr, QQmlRefPointer< QQmlContextData > context={})
static QQmlAnyBinding takeFrom(const QQmlProperty &prop)
Removes the binding from the property prop, and returns it as a QQmlAnyBinding if there was any.
QQmlAbstractBinding * asAbstractBinding() const
void installOn(const QQmlProperty &target, InterceptorMode mode=IgnoreInterceptors)
static QQmlAnyBinding createFromFunction(const QQmlProperty &prop, QV4::Function *function, QObject *obj, const QQmlRefPointer< QQmlContextData > &ctxt, QV4::ExecutionContext *scope)
static QQmlBinding * createTranslationBinding(const QQmlRefPointer< QV4::ExecutableCompilationUnit > &unit, const QV4::CompiledData::Binding *binding, QObject *obj, const QQmlRefPointer< QQmlContextData > &ctxt)
static QQmlBinding * create(const QQmlPropertyData *, const QQmlScriptString &, QObject *, QQmlContext *)
static QQmlRefPointer< QQmlContextData > get(QQmlContext *context)
static QQmlData * get(QObjectPrivate *priv, bool create)
Definition qqmldata_p.h:199
static QQmlBoundSignalExpression * signalExpression(const QQmlProperty &that)
Returns the expression associated with this signal property, or 0 if no signal expression exists.
static QQmlProperty create(QObject *target, const QString &propertyName, const QQmlRefPointer< QQmlContextData > &context, QQmlPropertyPrivate::InitFlags flags)
static void removeBinding(const QQmlProperty &that)
static void setSignalExpression(const QQmlProperty &that, QQmlBoundSignalExpression *)
Set the signal expression associated with this signal property to expr.
static QQmlPropertyPrivate * get(const QQmlProperty &p)
static QQmlAbstractBinding * binding(QObject *, QQmlPropertyIndex index)
The QQmlProperty class abstracts accessing properties on objects created from QML.
bool isValid() const
Returns true if the QQmlProperty refers to a valid property, otherwise false.
QVariant read() const
Returns the property value.
Type type() const
Returns the type of the property.
QMetaProperty property() const
Returns the \l{QMetaProperty} {Qt property} associated with this QML property.
QML_ANONYMOUSQObject * object
bool isSignalProperty() const
Returns true if this QQmlProperty represents a QML signal property.
bool isWritable() const
Returns true if the property is writable, otherwise false.
T * data() const
QQmlRefPointer< T > & adopt(T *)
Takes ownership of other.
static bool isHandlerName(QStringView signalName)
void verifyBindings(const QQmlRefPointer< QV4::ExecutableCompilationUnit > &compilationUnit, const QList< const QV4::CompiledData::Binding * > &props) override
void verifyList(const QQmlRefPointer< QV4::ExecutableCompilationUnit > &compilationUnit, const QV4::CompiledData::Binding *binding)
void applyBindings(QObject *obj, const QQmlRefPointer< QV4::ExecutableCompilationUnit > &compilationUnit, const QList< const QV4::CompiledData::Binding * > &bindings) override
ExpressionChange(const QString &_name, const QV4::CompiledData::Binding *_binding, QQmlBinding::Identifier _id, const QString &_expr, const QUrl &_url, int _line, int _column)
QQmlProperty property(const QString &)
QList< QQuickReplaceSignalHandler * > signalReplacements
void decodeBinding(const QString &propertyPrefix, const QQmlRefPointer< QV4::ExecutableCompilationUnit > &qmlUnit, const QV4::CompiledData::Binding *binding)
QList< QPair< QString, QVariant > > properties
QList< const QV4::CompiledData::Binding * > bindings
QQmlRefPointer< QV4::ExecutableCompilationUnit > compilationUnit
QList< ExpressionChange > expressions
void changeExpression(const QString &name, const QString &expression)
void removeProperty(const QString &name)
bool containsProperty(const QString &name) const
QString expression(const QString &name) const
QVariant property(const QString &name) const
bool isExplicit() const
\qmlproperty bool QtQuick::PropertyChanges::explicit
bool containsExpression(const QString &name) const
bool containsValue(const QString &name) const
QVariant value(const QString &name) const
ActionList actions() override
void changeValue(const QString &name, const QVariant &value)
void restoreEntryValuesChanged()
\qmltype PropertyChanges \inqmlmodule QtQuick
void copyOriginals(QQuickStateActionEvent *other) override
QQmlRefPointer< QQmlBoundSignalExpression > expression
bool mayOverride(QQuickStateActionEvent *other) override
EventType type() const override
QQmlRefPointer< QQmlBoundSignalExpression > rewindExpression
QQmlRefPointer< QQmlBoundSignalExpression > reverseExpression
QQmlProperty property
QObject * specifiedObject
QQuickStateActionEvent * event
QString specifiedProperty
QQmlAnyBinding toBinding
QQuickState * state() const
bool isStateActive() const
void removeAllEntriesFromRevertList(QObject *target)
bool removeEntryFromRevertList(QObject *target, const QString &name)
void addEntryToRevertList(const QQuickStateAction &action)
void addEntriesToRevertList(const QList< QQuickStateAction > &actions)
bool changeBindingInRevertList(QObject *target, const QString &name, QQmlAnyBinding binding)
iterator begin()
Definition qset.h:136
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qurl.h:94
QString url(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
Definition qurl.cpp:2817
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
Definition qurl.cpp:2831
const CompiledObject * objectAt(int index) const
QString bindingValueAsString(const CompiledData::Binding *binding) const
double bindingValueAsNumber(const CompiledData::Binding *binding) const
\inmodule QtCore
Definition qvariant.h:65
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:536
QSet< QString >::iterator it
Combined button and popup list for selecting options.
static void * context
DBusConnection const char DBusError * error
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLsizei const GLfloat * v
[13]
GLuint64 GLenum void * handle
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint GLuint end
GLenum GLuint id
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
GLenum GLuint GLsizei const GLenum * props
GLuint name
GLenum GLenum GLsizei void GLsizei void * column
GLhandleARB obj
[2]
GLuint entry
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
QT_BEGIN_NAMESPACE constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
Definition qpair.h:19
QQmlEngine * qmlEngine(const QObject *obj)
Definition qqml.cpp:80
QQmlContext * qmlContext(const QObject *obj)
Definition qqml.cpp:75
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
unsigned int quint32
Definition qtypes.h:50
unsigned short quint16
Definition qtypes.h:48
const char property[13]
Definition qwizard.cpp:101
QList< int > list
[14]
QUrl url("example.com")
[constructor-url-reference]
QSharedPointer< T > other(t)
[5]
engine evaluate("var myObject = new MyObject()")
[8]
\inmodule QtCore \reentrant
Definition qchar.h:18
union QV4::CompiledData::Binding::@540 value
ExecutionContext * rootContext() const
static Heap::QmlContext * create(QV4::ExecutionContext *parent, QQmlRefPointer< QQmlContextData > context, QObject *scopeObject)
ExecutionEngine * engine