部分代码有改动,为的是在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的时候就可以更改鼠标为一个图形,当松开的时候就又会恢复常用的箭头图形!