DevelopmentSupport

Since: BlackBerry 10.2.0

#include <bb/cascades/DevelopmentSupport>

Provides a signal for receiving live QML updates from the Momentics IDE for BlackBerry.

This class makes it faster to work with a QML-based UI because QML updates can be sent to the running application to greatly improve development turnaround time.

When QML assets are changed and updated in the Momentics IDE, the assetsChanged() signal is emitted. The application can capture this signal and respond by refreshing the QML scene graph. All updated QML files in the application assets folder are sent to the device.

To use this feature, you must enable sending QML files to a device. In the Momentics IDE, in Window > Preferences > BlackBerry, select Send QML files to device on save.

Note:

The assetsChanged() signal is only emitted if the application is launched from Momentics. However, you cannot use this signal when you have used the Export option in Momentics to export a release-ready BAR file.

Here is an example slot (connected to the assetsChanged() signal) that reloads all QML files but keeps the old data and context properties (Notice however, that all QML states are lost):
void ApplicationUI::reloadQML(QUrl mainFile) {
    // Get the context of the first scene root
    // to keep the contextProperties
    QDeclarativeContext* context
         = QDeclarativeEngine::contextForObject(mRoot);

    // Clear the QML cache
    QDeclarativeEngine* appEngine = context->engine();
    appEngine->clearComponentCache();

    // Reload all QML
    QmlDocument* qml = QmlDocument::create(mainFile);
    AbstractPane *root = qml->createRootObject<AbstractPane>(context);
    qml->setParent(root);
    Application::instance()->setScene(root);
}

To set this up, make the following changes to the application header file:

#include <QUrl>

namespace bb
{
    namespace cascades
    {
        class AbstractPane;
    }
}

private slots:
    void reloadQML(QUrl mainFile);
    void cleanup();

private:
    bb::cascades::AbstractPane* mRoot;

Then, add the following code to the end of the application constructor (after the call to setScene() in the applicationui.cpp file):

mRoot = Application::instance()->scene();
mRoot->setParent(this);
DevelopmentSupport* devSupport = new DevelopmentSupport(this);
bool res_changed = connect(devSupport,
        SIGNAL(assetsChanged(QUrl)),
        this,
        SLOT(reloadQML(QUrl)));
Q_ASSERT(res_changed);
Q_UNUSED(res_changed);

bool res_cleanup = connect(Application::instance(),
        SIGNAL(aboutToQuit()),
        this,
        SLOT(cleanup()));

Q_ASSERT(res_cleanup);
Q_UNUSED(res_cleanup);

In the code above, we make sure we save the scene root to be able to use its context for the reloaded QML files. In the applicationui.cpp file, we also declare the cleanup() slot to clean up that scene root.

void ApplicationUI::cleanup() {
    Application::instance()->setScene(0);
    mRoot->setParent(0);
    delete mRoot;
}


Overview

Inheritance

bb::cascades::BaseObject
bb::cascades::DevelopmentSupport

QML properties

Only has inherited QML properties

objectName: QStringInherited
parent: QObject [read-only]Inherited

QML signals

onAssetsChanged: {}
onCreationCompletedInherited: {}
onObjectNameChangedInherited: {}

Properties Index

Only has inherited properties

QStringobjectNameInherited
QObjectparent [read-only]Inherited

Public Functions Index

DevelopmentSupport (QObject *parent=0)
virtual ~DevelopmentSupport ()
voidsetObjectName (const QString &name)Inherited
virtual Q_INVOKABLE QStringtoDebugString () const Inherited

Protected Functions Index

Only has inherited protected functions

BaseObject (QObject *parent=0)Inherited

Signals Index

voidassetsChanged (const QUrl &mainQmlFile)
voidcreationCompleted ()Inherited
voidobjectNameChanged (const QString &objectName)Inherited

Properties

(Only has inherited properties)

QString objectNameInherited

This property is overridden from QObject.

As the objectName property is overridden from the QObject class, this signal will not be emitted if setObjectName() function is called directly on QObject.

The default value of this property is QString::null.

See also:

QObject::objectName().

Since:

BlackBerry 10.0.0

QObject parentInherited[read-only]

A read-only property that represents this object's parent.

The parent of an object is specified using QObject::setParent(QObject*). The purpose of the property is to expose the object's parent to QML.

This property is read-only to prevent modifications from QML, where typically the parent is declaratively set. In C++ code, the parent can be explicitly set using QObject::setParent(QObject*), or implicitly set by adding it to a visual container.

The default value of this property is 0.

Since:

BlackBerry 10.0.0

Public Functions

DevelopmentSupport (

Constructs a DevelopmentSupport.

Since:

BlackBerry 10.2.0

virtual~DevelopmentSupport ()

Destructor.

void setObjectName (Inherited

Sets the objectName property.

Parameters
name

The new name for the object.

Since:

BlackBerry 10.0.0

virtual Q_INVOKABLE QString toDebugString ()Inherited

Returns a debug string representing this object.

Return:

A debug string for the object.

Since:

BlackBerry 10.0.0

Protected Functions

(Only has inherited protected functions)

BaseObject (Inherited

Constructs an instance of BaseObject's subclass.

Parameters
parent

An optional parent, defaults to 0.

Since:

BlackBerry 10.0.0

Signals

void assetsChanged (
  • const QUrl &mainQmlFile)

Emitted when updated QML assets have been uploaded from Momentics.

Parameters
mainQmlFile

The QML file set as main file from Momentics.

Since:

BlackBerry 10.2.0

void creationCompleted ()Inherited

This signal is emitted only when this object is instantiated as a result of loading a QML document and creating the root node, or when an object is being constructed using its builder class.

This signal is emitted only when this object is instantiated as a result of loading a QML document and creating the root node (only after the root component that caused this instantiation has completed construction), or when the object is being constructed from its builder class. This signal is emitted to indicate that the construction and initialization of the object has been completed, the properties are initialized, and any QML binding values have been assigned to the object.

This signal is not emitted when the object is constructed from C++ using the constructor. If the object is constructed using its builder class, the signal is emitted when the the builder class returns the fully constructed object.

This signal can be used when there is an activity that needs to be performed, such as a property state integrity verification after the object is instantiated from a QML document or a builder, but before control is returned to the application.

See also:

QmlDocument

Since:

BlackBerry 10.0.0

void objectNameChanged (Inherited

This signal is emitted when the objectName property is changed.

Since:

BlackBerry 10.0.0

Last modified: 2014-03-13

comments powered by Disqus