部分代码有改动,为的是在QML中实现动态更改鼠标图案的效果!

目的:在qml中,当鼠标移动到一个位置(区域)时候(或其它的触发事件),改变鼠标的图案;

 

前提:自己定义了一个declarativeview,并将这个view注册到qml中(参考qml中注册和使用C++对象),然后再这个自定义的view中写了设置cursor的方法。

 

ps:这里的方法是自定义了view,并在里面写了相关方法,也可以自己定义一个其它的处理类,然后注册到qml中(应该,没有亲测)是一样的!

 

实现:

1、自定义一个view

#include <QDeclarativeView>


class MyDeclarativeView : public QDeclarativeView
{
    Q_OBJECT
public:
    explicit MyDeclarativeView(QWidget *parent = 0);

...

}

2、写相应的cursor处理方法:

void MyDeclarativeView::msetcursor(QGraphicsObject*obj,constQString &shape)

{
    if(NULL == obj)
        return;
    if("" == shape)
    {
        obj->unsetCursor();
        return;
    }
    Qt::CursorShape cursor;
    if (shape == "ArrowCursor")
        cursor = Qt::ArrowCursor;
    else if (shape == "SizeAllCursor")
        cursor = Qt::SizeAllCursor;
    else if(shape == "SizeVerCursor")
        cursor = Qt::SizeVerCursor;
    else if (shape == "SizeHorCursor")
        cursor = Qt::SizeHorCursor;
    else if (shape == "SizeFDiagCursor")
        cursor = Qt::SizeFDiagCursor;
    else if (shape == "CloseHandCursor")
        cursor = Qt::CloseHandCursor;
    else //shape == "ArrowCursor"
        cursor = Qt::ArrowCursor;

    obj->setCursor(cursor);
}

注:这里如果想要这个方法在qml中科院被调用,需要在方法声明的时候加上: Q_INVOKABLE,或者将方法声明为:publicslots,同样可以达到效果。

需要导入文件:

#include <QGraphicsObject>

 

3、注册到qml中:

MyDeclarativeViewview;

view.rootContext()->setContextProperty("WindowControl",&view);

4、在qml中调用:

Rectangle{

        id: topTitleContainer
 
        MouseArea{
            anchors.fill: parent

            onPressed: {
                WindowControl.msetcursor(topTitleContainer,"SizeAllCursor")
            }
            onReleased: {
                WindowControl.msetcursor(topTitleContainer,"ArrowCursor")
            }
        }
}

 

这样就算实现了一种当按着矩形框的topTitleContainer的时候就可以更改鼠标为一个图形,当松开的时候就又会恢复常用的箭头图形!