[Qt-qml] Q_INVOKABLE member function: Valid argument types
Jonathan Zhong
jonathan.zhong at panasonic.aero
Wed Oct 12 18:37:54 CEST 2011
Hi Girish,
Yes. Your proposed solution is simpler and more efficient. For multiple
values, especially when they have different data types, return a
QVariantMap:
QVariantMap value;
value.insert("myOutputInt", myOutputInt);
value.insert("myOutputStr", myOutputStr);
return value;
Thanks,
- Jonathan
On 10/11/2011 06:56 PM, Girish Ramakrishnan wrote:
> Hi Jonathan,
> For multiple values, return a QVariantMap.
>
> QVariantMap value;
> value.setProperty("myOutputInt1", myOutputInt1);
> value.setProperty("myOutputInt2", myOutputInt2);
> return value;
>
> And in the QML,
> var myVariant = myClassObject.myFunc5();
> var myInt1 = myVariant.myOutputInt1;
> var myInt2 = myVariant.myOutputInt2;
>
> You can also return a QVariantList for returning arrays.
>
> Girish
>
> On Wed, Oct 12, 2011 at 2:43 AM, Jonathan Zhong
> <jonathan.zhong at panasonic.aero> wrote:
>> Thanks! This is exactly the Qt documentation page I had been looking for. My
>> prior experimentation appears to support what the documentation says.
>>
>> There is one remaining issue: Since int * as an argument does not appear
>> working, what if I need to get more than one output integers from the
>> Q_INVOKABLE function?
>>
>> That is, since the following may not work:
>>
>> // !!! This Q_INVOKABLE function does not work:
>> void MyClass::myFunc4(int * myOutputInt1, int * myOutputInt2)
>> {
>> *myOutputInt1 = 11111;
>> *myOutputInt2 = 22222;
>> }
>>
>> one solution is to package the 2 output integers into an object of a Qt
>> class that is recognizable by QML, for example, QVariant, as illustrated
>> below:
>>
>> // This Q_INVOKABLE function appears working:
>> QVariant MyClass::myFunc5()
>> {
>> int myOutputInt1 = 11111;
>> int myOutputInt2 = 22222;
>>
>> QScriptEngine engine;
>>
>> QScriptValue value = engine.newObject();
>> value.setProperty("myOutputInt1", myOutputInt1);
>> value.setProperty("myOutputInt2", myOutputInt2);
>>
>> return value.toVariant();
>> }
>>
>> And in my QML code, I'll do something like this:
>>
>> var myVariant = myClassObject.myFunc5();
>> var myInt1 = myVariant.myOutputInt1;
>> var myInt2 = myVariant.myOutputInt2;
>>
>> This, although it works, does not look simple and straightforward. Is there
>> a better way?
>>
>>
>> On 10/11/2011 11:02 AM, Girish Ramakrishnan wrote:
>>> Hi Jonathan,
>>>
>>> On Tue, Oct 11, 2011 at 10:36 PM, Jonathan Zhong
>>> <jonathan.zhong at panasonic.aero> wrote:
>>>> Hi,
>>>>
>>>> What are the valid argument types of an invokable member function of a
>>>> QML extension C++ class? I have noticed that these work:
>>>>
>>>> Q_INVOKABLE void myFunc1(int myInputInt);
>>>> Q_INVOKABLE void myFunc2(int& myInputInt); // but myInputInt cannot
>>>> be modified.
>>>>
>>>> while this does not work:
>>>>
>>>> Q_INVOKABLE void myFunc3(int * myOutputInt); // This will cause a
>>>> runtime error when running qmlviewer.
>>>>
>>>> It appears that:
>>>> 1. The argument can be an object of (or reference to) a basic C/C++ data
>>>> type (int, int&, double, double&, ...).
>>>> 2. The argument can be an object or (or reference to) a Qt class which
>>>> relates to a basic QML type (QString, QString&, QVariant, QVariant&, ..).
>>>> 3. The argument can be a pointer to QObject or its derived classes
>>>> (QObject *, QWidget *, ...).
>>>> ...
>>>>
>>>> Is there a Qt documentation page on this subject?
>>>>
>>>> Perhaps this is a related question: What are the valid return types of
>>>> an invokable member function?
>>>>
>>> See
>>> http://doc.qt.nokia.com/main-snapshot/qtbinding.html#supported-data-types
>>>
>>> Girish
>>
>>
>> Disclaimer: The information contained in this transmission, including any
>> attachments, may contain confidential information of Panasonic Avionics
>> Corporation. This transmission is intended only for the use of the
>> addressee(s) listed above. Unauthorized review, dissemination or other use
>> of the information contained in this transmission is strictly prohibited. If
>> you have received this transmission in error or have reason to believe you
>> are not authorized to receive it, please notify the sender by return email
>> and promptly delete the transmission.
>>
>>
>>
More information about the Qt-qml
mailing list