[Interest] Function overload and QML

Federico Buti bacarozzo at gmail.com
Mon Feb 16 13:17:36 CET 2015


Ok...sorry for the spam.  I've  just noticed this sentence in the
documentation QVariantList and QVariantMap to JavaScript Array and Object
<http://doc.qt.io/qt-5/qtqml-cppintegration-data.html>:

[...] Similarly, if a C++ type uses a QVariantList
<http://doc.qt.io/qt-5/qvariant.html#QVariantList-typedef> or QVariantMap
<http://doc.qt.io/qt-5/qvariant.html#QVariantMap-typedef> type for a
property type or method parameter, the value can be created as a JavaScript
array or object in QML, and is automatically converted to aQVariantList
<http://doc.qt.io/qt-5/qvariant.html#QVariantList-typedef> or QVariantMap
<http://doc.qt.io/qt-5/qvariant.html#QVariantMap-typedef> when it is passed
to C++.

So, following that "or object in QML", is this the case I've encountered?
The string object was trasformed in a  QVariantList, matching the first
signature in the reorderd header?
Thanks again,
F.

---
Federico Buti

On 16 February 2015 at 13:09, Federico Buti <bacarozzo at gmail.com> wrote:

> Hi list.
>
> I've made an intensive use of INVOKABLE/SLOT  functions in QML and I've
> never encounted any problem. Up until now.
>
> I'm sure that function overloading works properly since I've used it a lot
> (also the related commit can be found here
> <https://qt.gitorious.org/qt/tmartsums-qt/commit/1d7b672fd46abab51a0124ad19aad18e5d14f1a8>).
> However, I've noticed a strange behaviour by working with the
> ArrayDataModel available here <https://github.com/dridk/ArrayDataModel>.
>
> I've registered an instance of the model as a context property in the
> usual way:
>
> ArrayDataModel model;
>
> engine.rootContext()->setContextProperty("model", &model);
>
>
> Then in QML I've inserted a call to a SLOT in this way:
>
> Button {
>
>     text: "click me!"
>
>     onClicked: {
>
>         model.insert(model.size(), "Item " + (model.size() + 1));
>
>     }
>
> }
>
>
> Theoretically, the method to be invoked by the runtime should be
>
>     void insert (int i, const QVariant &value);
>
>
> However, if I exchange position of overloaded functions, i.e. if I write
> the header as
> ​​
>
>     Q_SLOT void	insert (int i, const QVariant &value);
>
>     Q_SLOT void	insert (int i, const QVariantList &values);
>
>
> instead of the original
>
>     Q_SLOT void insert (int i, const QVariantList &values);
>
>     Q_SLOT void insert (int i, const QVariant &value);
>
>
> the function which is called is (wrongly)
>
>
>
>     Q_SLOT void insert (int i, const QVariantList &values);
>
>
> ​Is this
> ​ a BUG, an intended behaviour, a specific conversion JS <--> C++, e.g.
> the parameter is seen as a single-item-array and made match with the wrong
> overload? Or something else I cannot understand? :)
> Thanks in advance for any insight,
> F.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150216/16b5bc3e/attachment.html>


More information about the Interest mailing list