diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/doc/src/javascript/resources.qdoc | 27 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 14 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 42 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype_p.h | 13 | ||||
-rw-r--r-- | src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc | 2 | ||||
-rw-r--r-- | src/quick/doc/src/qtquick.qdoc | 2 | ||||
-rw-r--r-- | src/quick/items/qquickdrag.cpp | 4 | ||||
-rw-r--r-- | src/quick/items/qquickpathview.cpp | 5 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol.cpp | 1 |
9 files changed, 75 insertions, 35 deletions
diff --git a/src/qml/doc/src/javascript/resources.qdoc b/src/qml/doc/src/javascript/resources.qdoc index 34b0610f74..60f97c2007 100644 --- a/src/qml/doc/src/javascript/resources.qdoc +++ b/src/qml/doc/src/javascript/resources.qdoc @@ -26,7 +26,7 @@ ****************************************************************************/ /*! \page qtqml-javascript-resources.html -\title Defining JavaScript Resources In QML +\title Defining JavaScript Resources in QML \brief Description of how JavaScript files may be defined for use in QML The program logic for a QML application may be defined in JavaScript. The @@ -60,7 +60,8 @@ An example of a code-behind implementation resource follows: \code // MyButton.qml import QtQuick 2.0 -import "my_button_impl.js" as Logic // a new instance of this JavaScript resource is loaded for each instance of Button.qml +import "my_button_impl.js" as Logic // A new instance of this JavaScript resource + // is loaded for each instance of Button.qml. Rectangle { id: rect @@ -95,13 +96,18 @@ for maintainability and readability. \section1 Shared JavaScript Resources (Libraries) -Some JavaScript files act more like libraries - they provide a set of helper -functions that take input and compute output, but never manipulate QML -component instances directly. +By default, JavaScript files imported from QML share their context with the QML +component. That means the JavaScript files have access to the same QML objects +and can modify them. As a consequence, each import must have a unique copy of +these files. -As it would be wasteful for each QML component instance to have a unique copy of -these libraries, the JavaScript programmer can indicate a particular file is a -shared library through the use of a pragma, as shown in the following example. +\l {Defining JavaScript Resources in QML#Code-Behind Implementation Resource} +{The previous section} covers stateful imports of JavaScript files. However, +some JavaScript files are stateless and act more like reusable libraries, in +the sense that they provide a set of helper functions that do not require +anything from where they were imported from. You can save significant amounts +of memory and speed up the instantiation of QML components if you mark such +libraries with a special pragma, as shown in the following example. \code // factorial.js @@ -141,7 +147,10 @@ For example: \code // Calculator.qml import QtQuick 2.0 -import "factorial.js" as FactorialCalculator // this JavaScript resource is only ever loaded once by the engine, even if multiple instances of Calculator.qml are created +import "factorial.js" as FactorialCalculator // This JavaScript resource is only + // ever loaded once by the engine, + // even if multiple instances of + // Calculator.qml are created. Text { width: 500 diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 962c92fdb0..1c37894751 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -158,6 +158,8 @@ QQmlType fetchOrCreateTypeForUrl(const QString &urlString, const QHashedStringRe // can guarentee it will live long enough to reach qmlregister. QByteArray buf(unqualifiedtype.toString().toUtf8()); + QQmlMetaTypeRegistrationFailureRecorder failureRecorder; + // Register the type. Note that the URI parameters here are empty; for // file type imports, we do not place them in a URI as we don't // necessarily have a good and unique one (picture a library import, @@ -200,9 +202,9 @@ QQmlType fetchOrCreateTypeForUrl(const QString &urlString, const QHashedStringRe // data. if (!ret.isValid()) { if (!errors) // Cannot list errors properly, just quit - qFatal("%s", QQmlMetaType::typeRegistrationFailures().join('\n').toLatin1().constData()); + qFatal("%s", failureRecorder.failures().join('\n').toLatin1().constData()); QQmlError error; - error.setDescription(QQmlMetaType::typeRegistrationFailures().join('\n')); + error.setDescription(failureRecorder.failures().join('\n')); errors->prepend(error); } return ret; @@ -2022,7 +2024,7 @@ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &b const QByteArray bytes = uri.toUtf8(); const char *moduleId = bytes.constData(); - QStringList registrationFailures; + QQmlMetaTypeRegistrationFailureRecorder failureRecorder; { // Create a scope for QWriteLocker to keep it as narrow as possible, and // to ensure that we release it before the call to initalizeEngine below @@ -2064,14 +2066,12 @@ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &b } iface->registerTypes(moduleId); - - registrationFailures = QQmlMetaType::typeRegistrationFailures(); QQmlMetaType::setTypeRegistrationNamespace(QString()); } // QWriteLocker lock(QQmlMetaType::typeRegistrationLock()) - if (!registrationFailures.isEmpty()) { + if (!failureRecorder.failures().isEmpty()) { if (errors) { - for (const QString &failure : qAsConst(registrationFailures)) { + for (const QString &failure : failureRecorder.failures()) { QQmlError error; error.setDescription(failure); errors->prepend(error); diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 69a8ff034a..b31058ece5 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -114,13 +114,27 @@ struct QQmlMetaTypeData QSet<QString> protectedNamespaces; QString typeRegistrationNamespace; - QStringList typeRegistrationFailures; QHash<int, int> qmlLists; QHash<const QMetaObject *, QQmlPropertyCache *> propertyCaches; QQmlPropertyCache *propertyCache(const QMetaObject *metaObject); QQmlPropertyCache *propertyCache(const QQmlType &type, int minorVersion); + + void startRecordingTypeRegFailures(QStringList *storage) + { typeRegistrationFailures = storage; } + void stopRecordingTypeRegFailures() + { startRecordingTypeRegFailures(nullptr); } + void recordTypeRegFailure(const QString &message) + { + if (typeRegistrationFailures) + typeRegistrationFailures->append(message); + else + qWarning("%s", message.toUtf8().constData()); + } + +private: + QStringList *typeRegistrationFailures = nullptr; }; class QQmlTypeModulePrivate @@ -152,6 +166,16 @@ static uint qHash(const QQmlMetaTypeData::VersionedUri &v) return v.uri.hash() ^ qHash(v.majorVersion); } +QQmlMetaTypeRegistrationFailureRecorder::QQmlMetaTypeRegistrationFailureRecorder() +{ + metaTypeData()->startRecordingTypeRegFailures(&_failures); +} + +QQmlMetaTypeRegistrationFailureRecorder::~QQmlMetaTypeRegistrationFailureRecorder() +{ + metaTypeData()->stopRecordingTypeRegFailures(); +} + QQmlMetaTypeData::QQmlMetaTypeData() { } @@ -1581,7 +1605,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da if (!typeName.isEmpty()) { if (typeName.at(0).isLower()) { QString failure(QCoreApplication::translate("qmlRegisterType", "Invalid QML %1 name \"%2\"; type names must begin with an uppercase letter")); - data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName)); + data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName)); return false; } @@ -1589,7 +1613,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da for (int ii = 0; ii < typeNameLen; ++ii) { if (!(typeName.at(ii).isLetterOrNumber() || typeName.at(ii) == '_')) { QString failure(QCoreApplication::translate("qmlRegisterType", "Invalid QML %1 name \"%2\"")); - data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName)); + data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName)); return false; } } @@ -1603,7 +1627,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da if (data->protectedNamespaces.contains(nameSpace)) { QString failure(QCoreApplication::translate("qmlRegisterType", "Cannot install %1 '%2' into protected namespace '%3'")); - data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace)); + data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace)); return false; } } else if (majorVersion >= 0) { @@ -1614,7 +1638,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da if (QQmlTypeModulePrivate::get(qqtm)->locked){ QString failure(QCoreApplication::translate("qmlRegisterType", "Cannot install %1 '%2' into protected module '%3' version '%4'")); - data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace).arg(majorVersion)); + data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace).arg(majorVersion)); return false; } } @@ -1905,14 +1929,6 @@ void QQmlMetaType::setTypeRegistrationNamespace(const QString &uri) QQmlMetaTypeData *data = metaTypeData(); data->typeRegistrationNamespace = uri; - data->typeRegistrationFailures.clear(); -} - -QStringList QQmlMetaType::typeRegistrationFailures() -{ - QQmlMetaTypeData *data = metaTypeData(); - - return data->typeRegistrationFailures; } QMutex *QQmlMetaType::typeRegistrationLock() diff --git a/src/qml/qml/qqmlmetatype_p.h b/src/qml/qml/qqmlmetatype_p.h index 6df439cd7a..4a5e4ba266 100644 --- a/src/qml/qml/qqmlmetatype_p.h +++ b/src/qml/qml/qqmlmetatype_p.h @@ -155,7 +155,6 @@ public: static void protectNamespace(const QString &); static void setTypeRegistrationNamespace(const QString &); - static QStringList typeRegistrationFailures(); static QMutex *typeRegistrationLock(); @@ -361,6 +360,18 @@ private: int m_minor; }; +class Q_AUTOTEST_EXPORT QQmlMetaTypeRegistrationFailureRecorder +{ + QStringList _failures; + +public: + QQmlMetaTypeRegistrationFailureRecorder(); + ~QQmlMetaTypeRegistrationFailureRecorder(); + + QStringList failures() const + { return _failures; } +}; + QT_END_NAMESPACE #endif // QQMLMETATYPE_P_H diff --git a/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc b/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc index 30aca38678..f27f87e743 100644 --- a/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc +++ b/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc @@ -420,7 +420,7 @@ on the display resolution on offer. \section2 Related Information \list - \li \l{Qt Quick Controls2 - Gallery Example}{Gallery example} + \li \l{Qt Quick Controls 2 - Gallery Example}{Gallery example} \li \l{Qt Quick Controls 2 - Text Editor}{Text Editor example} \li \l{Font Awesome} \li \l{Scalability} diff --git a/src/quick/doc/src/qtquick.qdoc b/src/quick/doc/src/qtquick.qdoc index 4d8da5ed5a..4b843f366b 100644 --- a/src/quick/doc/src/qtquick.qdoc +++ b/src/quick/doc/src/qtquick.qdoc @@ -118,7 +118,7 @@ Additional Qt Quick information: \li \l{Qt Quick Test QML Types}{Tests} - contains types for writing unit test for a QML application \endlist \li \l{Qt Quick Examples and Tutorials} -\li \l{Qt Quick Guidelines} +\li \l{Best Practices for QML and Qt Quick}{Qt Quick Guidelines} \endlist Further information for writing QML applications: diff --git a/src/quick/items/qquickdrag.cpp b/src/quick/items/qquickdrag.cpp index 91f45894a0..f60f3c1ccf 100644 --- a/src/quick/items/qquickdrag.cpp +++ b/src/quick/items/qquickdrag.cpp @@ -41,7 +41,6 @@ #include <private/qguiapplication_p.h> #include <qpa/qplatformintegration.h> -#include <qpa/qplatformdrag.h> #include <private/qquickitem_p.h> #include <QtQuick/private/qquickevents_p_p.h> #include <private/qquickitemchangelistener_p.h> @@ -50,12 +49,13 @@ #include <private/qv4scopedvalue_p.h> #include <QtCore/qmimedata.h> #include <QtQml/qqmlinfo.h> -#include <QtGui/qdrag.h> #include <QtGui/qevent.h> #include <QtGui/qstylehints.h> #include <QtGui/qguiapplication.h> #if QT_CONFIG(draganddrop) +#include <qpa/qplatformdrag.h> +#include <QtGui/qdrag.h> QT_BEGIN_NAMESPACE diff --git a/src/quick/items/qquickpathview.cpp b/src/quick/items/qquickpathview.cpp index 74c8eaa169..879db6284e 100644 --- a/src/quick/items/qquickpathview.cpp +++ b/src/quick/items/qquickpathview.cpp @@ -240,9 +240,13 @@ void QQuickPathViewPrivate::clear() releaseItem(currentItem); currentItem = nullptr; } + for (QQuickItem *p : qAsConst(items)) releaseItem(p); + for (QQuickItem *p : qAsConst(itemCache)) + releaseItem(p); + if (requestedIndex >= 0) { if (model) model->cancel(requestedIndex); @@ -250,6 +254,7 @@ void QQuickPathViewPrivate::clear() } items.clear(); + itemCache.clear(); tl.clear(); } diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 1cb12235c1..38ca7283b4 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -47,7 +47,6 @@ #include <qfontmetrics.h> #include <qevent.h> #include <qdebug.h> -#include <qdrag.h> #include <qclipboard.h> #include <qtimer.h> #include <qinputmethod.h> |