Change mousecursor from QML with setContextProperty and Qt::CursorShape



  • Hi,

    This is not a request for help. Just a post showing people how to do this.
    My case was as follows. I needed to change my cursor shape to Qt::SizeVerCursor for some resizing QML component that i'm making. But i didn't want to make my own QML component just for that so i made a utils class which is assigned to QML by using setContextProperty. In that class i had a function with this:

    @Q_INVOKABLE void setCursor(Qt::CursorShape shape);@

    That however doesn't work when calling from QML. It does when you make a own custom component, but apparently it doesn't when you use setContextProperty. This is very annoying because all the Qt::CursorShape values are available in QML right now under Qt.<enum_name> so Qt.SizeVerCursor would work for me in passing the value like so:
    Note: <property> is the value you set when using setContextProperty.

    <property>.setCursor(Qt.SizeVerCursor);

    Sadly, the function argument to allow the type: Qt::CursorShape isn't registered and doesn't want to be registered with qmlRegisterType since it's not an object, just an enum...

    So i had the issue of not being able to pass Qt::CursorShape as a function argument when i'm using setContextProperty.
    Now i could go for this solution: http://qt-project.org/forums/viewthread/1886 (passing a string to the function) which would make the call something like this:

    <property>.setCursor("SizeVerCursor");

    That's obviously not what i wanted to do. Now here comes a neat trick. Enums are just int numbers so you can pass them in a function that accepts an int argument. The function look like this:

    @Q_INVOKABLE void setCursor(int shape);@

    Now in QML you can simply do:

    <property>.setCursor(Qt.SizeVerCursor);

    In the C++ side you can just check like this:

    @void ClassName::setCursor(int shape)
    {
    if(shape == Qt::SizeVerCursor)
    {
    // ... do something with it
    }
    }
    @

    This works and allows you to use the full enum of http://qt-project.org/doc/qt-4.8/qt.html#CursorShape-enum without the need to add some custom string parsing/checking.

    What i would've liked more is just the ability to register a function argument type. Apparently that's only possible when sending full blown objects to QML, not with setContextProperty ...

    This probably helps a few people out there :)
    Note: in QML 2 this is a lot easier if you need to change the cursor shape on some MouseArea. There is just a property for it in QML 2: http://doc-snapshot.qt-project.org/5.0/qml-qtquick2-mousearea.html#cursorShape-prop

    Cheers,
    Mark


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.