[Development] Re: Controlling QML Imports

Jan Kundrát jkt at flaska.net
Wed Dec 12 02:27:40 CET 2012


On Tuesday, 11 December 2012 04:23:51 CEST, Alan Alpert wrote:
> For finer-grained control over QML it would make sense to have an API
> allowing import restrictions. Two usecases come to mind, platform
> security contexts and scriptable applications.

I'm currently using QML as a configuration language (being declarative looked like a great fit) in a random application. The end goal was to have one file per supported "type of thing" that the application works on. The description of each thing looks like this:

  import foo.bar 1.0

  ThingType {
    // ...
    SubThing {
      // ...
    }
  }

Because I'm stuck on 4.x for this particular application, I had to work with what is available now. In the end, I settled on:

- Using just a QDeclarativeEngine as a good start -- no need for UI items in my use case

- The ThingType and SubThing are actually implemented in C++

- Enforcing that the top-level item created in QML is exactly the ThingType. This can be done when instantiating the component by checking its type via qobject_cast<QMLMyTypeThing*> and refusing to work with that QML file if this cast fails

- The ThingType has a QDeclarativeListProperty<QMLMySubThing> Q_PROPERTY which is also a default property. This way, the type of the children of the ThingType is enforced.

- If you need further enforcing of certain rules ("each ThingType has to be yellow"), you can inherit from QDeclarativeParserStatus and implement componentComplete. My code works like this:

  if (!m_color.isYellow())
    qmlInfo(this) << "The color must be yellow."

- Because these errors are only warnings (and it looks like you cannot really trigger a fatal error from this stage), I have an isOk() method which I call before I use the data structure which gets created as a result of these QML files.

If it was possible to prevent defining the QtQuick namespace from being available, that would solve half of my problems (with the required property validation being the remaining half).

The blurb about qmlInfo() was in particular rather hard to discover -- I had read the docs about it before but could not recall the name of the function when I needed it. Searching for it via phrases like "qml error reporting" did not help much.

With kind regards,
Jan



More information about the Development mailing list