[SailfishDevel] QDeclarativePropertyMap not dynamic?

Ruediger Gad r.c.g at gmx.de
Sat Jun 15 11:59:41 UTC 2013


Fwiw, just updated my tiny QML <-> C++ example to also show interaction 
via signals of properties:
https://github.com/ruedigergad/QML-CPP_Interaction_Example

Generally, I am quite happy with the qmlRegisterType approach, as shown 
in that example.



hth

Ruediger




On 06/15/2013 11:44 AM, christopher.lamb at thurweb.ch wrote:
> Hi Superpelican
>
> I had almost forgotten PropertyChanged!
>
> It was a nonsense example to show 4 different ways of doing the same
> thing, to prove / disprove that all 4 options work.
>
> In a real life application that actually does something useful you would
> only use one of the 4 options to respond to one change.
>
> Comment things in and out, and you will see that all 4 approaches are
> independent.
>
> What I was trying to show is that you can respond to a change in a
> property (both QML native, and one imported from C++) by either direct
> binding, or in response to an onXxxxChanged signal / event handler.
>
> Whether you use a binding, or an onXxxxChanged signal is a matter of
> taste and horses for courses.
>
> If your changes are simple and few in number, then binding is a good
> option.
>
> If you want to change lots of things, with complex logic, then grouping
> all of this together in an onXxxxChanged or even a State might be the
> better option.
>
> I vaguely remember finding cases where binding did not work as expected,
> but can't remember what these were.
>
>  From a software engineering / architectural point of view it also
> depends on where you wish to embed control and knowledge of other items.
> Should the thing doing the change be in control (onXxxxChanged), or the
> thing that changes (the binding approach)?
>
> I can't really comment on if there are c++ alternatives to the plugin
> approach. My c++ programming follows the cut and paste school. In
> Harmattan and Sailfish I have successfully made several c++ plugins as a
> last resort approach when I have found no clean way to achieve the same
> with QML / javascript. So far Plugins have worked for me.
>
>
>
>
> Zitat von Superpelican <superpelican at zoho.com>:
>
>> Hi everyone,
>>
>> I've been looking at the PropertyChanged project again and do I need
>> to use both the Q_PROPERTY stuff and the method/signals way? Or can I
>> just use 1 of them?
>>
>> Also do I need to make a plugin of the C++ part of my application or
>> is there also another way to do it?
>>
>> Kind Regards,
>>
>> Superpelican
>>
>>
>> On 05/09/2013 04:30 PM, christopher.lamb at thurweb.ch wrote:
>>> Hi SuperPelican
>>>
>>> After a little playing around, I have created a minimal SailfishOS
>>> app that demonstrates interaction between a c++ plugin and SailfishOS
>>> QML UI elements.
>>>
>>> Once again I have gone the QmlRegisterType / plugin approach. The app
>>> itself is the default SailfishOS QML project, with a few minor changes.
>>>
>>> The app has a SailfishOS PullDownMenu. If you click on the MenuItem
>>> "increment counters", four QML labels have their values changed, each
>>> by a different approach.
>>>
>>> When the MenuItem is clicked, it actually updated 2 properties, one
>>> QML "FirstPage.qmlCounter"; and one "cppCounter" exposed by the C++
>>> plugin CPlusPlusCounter 1.0 (which is instantiated as a QML object
>>> myCPlusPlusCounter.
>>>
>>> 1) "qml.counter binding" is a simple binding to the QML property
>>> "qmlCounter" (no C++)
>>> 2) "qml.counter onChanged" is changed by the "onQmlCounterChanged"
>>> event of the same QML property (no C++)
>>> 3) "myCPlusPlusCounter binding" is a binding to the property
>>> "cppCounter" exposed by the C++ plugin
>>> 4) "myCPlusPlusCounter onChanged" is changed by the
>>> "onCppCounterChanged" event of the same C++ plugin property
>>>
>>> All the QML changes are in FirstPage.qml
>>> C++ required minor changes to main.cpp ( qmlRegisterType entry +
>>> includes)
>>> and the new files cpluspluscounter.h / .cpp
>>>
>>> You should find the entire project as an attachment to this post.
>>>
>>> I hope this helps
>>>
>>> Chris
>>>
>>>
>>> Zitat von Superpelican <superpelican at zoho.com>:
>>>
>>>> I'm trying to create a hybrid QML/C++ application, where the logic
>>>> is written in C++ and the interface is QML/Sailfish Silica based.
>>>>
>>>> I'm currently playing around with the different ways to let QML/C++
>>>> communicate with each other. I currently have this code:
>>>>
>>>> <code>
>>>> #include <QApplication>
>>>> #include <QGraphicsObject>
>>>> #include <QDir>
>>>> #include <QDeclarativeView>
>>>> #include <QDeclarativeContext>
>>>> #include <QDeclarativeEngine>
>>>> #include <QDeclarativeComponent>
>>>> #include <QDebug>
>>>> #include <QDeclarativePropertyMap>
>>>>
>>>> #ifdef HAS_BOOSTER
>>>> #include <MDeclarativeCache>
>>>> #endif
>>>>
>>>> Q_DECL_EXPORT int main(int argc, char *argv[])
>>>> {
>>>>    #ifdef HAS_BOOSTER
>>>>        QScopedPointer<QApplication>
>>>> myapp(MDeclarativeCache::qApplication(argc, argv));
>>>>    #else
>>>>        QScopedPointer<QApplication> myapp = new QApplication(argc,
>>>> argv);
>>>>    #endif
>>>>
>>>>
>>>>    #ifdef HAS_BOOSTER
>>>>        QScopedPointer<QDeclarativeView>
>>>> appview(MDeclarativeCache::qDeclarativeView());
>>>>    #else
>>>>        QScopedPointer<QDeclarativeView>(new QDeclarativeView);
>>>>    #endif
>>>>
>>>>    QDeclarativePropertyMap binding_map;
>>>>    binding_map.insert("question_txt", QVariant(QString("5 * 5 =")));
>>>>    binding_map.insert("color", QVariant(QString("dark red")));
>>>>    QScopedPointer<QDeclarativeContext>
>>>> binding_context(appview->rootContext());
>>>>    binding_context->setContextProperty("binding_map", &binding_map);
>>>>    QString file = "main.qml";
>>>>    QString path = QString(DEPLOYMENT_PATH);
>>>>    appview->setSource(QUrl::fromLocalFile(path + file));
>>>> appview->setResizeMode(QDeclarativeView::SizeRootObjectToView);
>>>>    appview->setAttribute(Qt::WA_OpaquePaintEvent);
>>>>    appview->setAttribute(Qt::WA_NoSystemBackground);
>>>> appview->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
>>>> appview->viewport()->setAttribute(Qt::WA_NoSystemBackground);
>>>>    appview->showFullScreen();
>>>>    binding_map["question_txt"] = QVariant(QString("overwritten 5 * 5
>>>> ="));
>>>>    return myapp->exec();
>>>> }
>>>> </code>
>>>> I need to let C++ print text in the QML interface (the question) and
>>>> C++ has to obtain the
>>>> answer the user has answered in the QML interface (TextField Silica
>>>> component). That's basically
>>>> the needed communication between C++ and QML.
>>>>
>>>> So I thought that I'd create a QDeclarativePropertyMap in C++. This
>>>> propertymap will contain the question.
>>>> My program has a while loop that asks the user new questions each
>>>> time the loop runs(the logic code can be found here
>>>> <https://bitbucket.org/Superpelican/clamshell_cli>,
>>>> but it hasn't been adjusted for use with a GUI, it's currently a CLI
>>>> application). So I need to constantly update the QML UI from C++
>>>> while the programs running, after I've setup the QDeclarativeView etc.
>>>>
>>>> However I noticed that if you change a value in the propertymap
>>>> after initializing and showing the QDeclarativeView, the UI won't be
>>>> updated!
>>>> I thought the QDeclarativePropertyMap was dynamic!
>>>> http://qt-project.org/doc/qt-4.8/qdeclarativepropertymap.html#details:
>>>> "The binding is dynamic - whenever a key's value is updated,
>>>> anything bound to that key will be updated as well."
>>>>
>>>> Kind Regards,
>>>>
>>>> Superpelican
>>>>
>>>>
>>>>
>>
>>
>> _______________________________________________
>> SailfishOS.org Devel mailing list
>>
>
>
>
> _______________________________________________
> SailfishOS.org Devel mailing list


-- 
http://ruedigergad.com

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4441 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.sailfishos.org/pipermail/devel/attachments/20130615/e4d4c31f/attachment.bin>


More information about the Devel mailing list