[Interest] QML introspection and dynamic component creation
gareth.stockwell at accenture.com
gareth.stockwell at accenture.com
Fri Dec 16 12:34:29 CET 2011
I'm working on a piece of UI which would be straightforward to implement using an imperative toolkit, but I'm struggling to understand how to express it declaratively. Hopefully one of the QML gurus out there can show me the way.
The application (*) is a demo of how to apply post-processing effects to video/viewfinder content, using shader programs. Each effect has zero, one or more parameters, which consist of a real value and a name. When a given effect is selected, the application should display the appropriate number of sliders, each labeled with the name of the parameter, and connect up each slider to the corresponding parameter value. The problem is that, while I can express the list of parameters in QML, I can't figure out a clean way of creating and connecting the slider controls.
Here are some code snippets which should make this a bit clearer:
// Parameter.qml
QtObject {
property string name
property real value: 0.5
}
// WobbleEffect.qml
ShaderEffect {
Parameter {
id: speedParameter
name: "speed"
}
Parameter {
id: amplitudeParameter
name: "amplitude"
}
// Define names which will be mapped onto shader uniforms
property alias speed: speedParameter.value
property alias amplitude: amplitudeParameter.value
fragmentShader: "
uniform float speed;
uniform float amplitude;
// ...
"
}
// Slider.qml
Rectangle {
property string label
property real value
// ...
}
// ParameterPanel.qml
Rectangle {
property Item effect
}
When the user selects Wobble from the list of effects, a Loader is used to create a WobbleEffect item, and the id of this item is assigned to the effect property of the ParameterPanel. What I then want to happen is for sliders to be created and connected, so that we end up with the equivalent of the following:
ParameterPanel {
Slider {
id: speedSlider
anchors { top: parent.top; left: parent.left; right: parent.right }
width: parent.width
label: effect.speedParameter.name
value: effect.speedParameter.value
onValueChanged: effect.speedParameter.value = value
}
Slider {
id: amplitudeSlider
anchors { top: speedSlider.bottom; left: parent.left; right: parent.right }
width: parent.width
label: effect.amplitudeParameter.name
value: effect.amplitudeParameter.value
onValueChanged: effect.amplitudeParameter.value = value
}
}
I feel that this should be possible, using a combination of the effect.children list, some JavaScript and Qt.createComponent(), but I can't quite see how to put these together. Can anyone shed some light?
(*) The app has recently been added to QtMobility (demos/video/qmlvideofx<http://qt.gitorious.org/qt-mobility/qt-mobility/trees/master/demos/video/qmlvideofx>) and I've just about finished porting it to Qt5<https://bugreports.qt.nokia.com/browse/QTBUG-23118> for contribution to the QtMultimedia module. The code as it stands does dynamically create sliders, and connects them up to the appropriate ShaderEffect properties, but the way this is done is not very clean - hence this message.
________________________________
Subject to local law, communications with Accenture and its affiliates including telephone calls and emails (including content), may be monitored by our systems for the purposes of security and the assessment of internal compliance with Accenture policy.
______________________________________________________________________________________
www.accenture.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20111216/2d6b5baf/attachment.html>
More information about the Interest
mailing list