Reputation: 103
Is there any way to change the cursor shape in QML? I am using Qt 4.7 and Python, so I can't use Qt Quick 2, and in Qt Quick there in no cursor shape option.
Upvotes: 1
Views: 2318
Reputation: 1
An example:
main.py:
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtDeclarative import *
class CursorArea (QDeclarativeItem):
def __init__(self, parent = None):
QDeclarativeItem.__init__(self, parent)
self._cursors = Qt.CursorShape.ArrowCursor
self._cursorsPix = "None"
self._cursorsPixUrl = []
self.dictPix = {"lapizAzul": QCursor(QPixmap("lapiz1.png"),1,32),
"lapizVerde": QCursor(QPixmap("lapiz1.png"),1,32),
"lapizCorona": QCursor(QPixmap("lapiz1.png"),1,32),
}
def getCursors(self):
return self_cursors
def setCursors(self,value):
self._cursors = value
self.setCursor(value)
cursors = Property(Qt.CursorShape, getCursors, setCursors)
def getCursorsPix(self):
return self._cursorsPix
def setCursorsPix(self, value):
print (value)
pixmap = self.buscarPixmap(value)
self.setCursor(pixmap)
cursorsPix = Property("QString", getCursorsPix, setCursorsPix)
def buscarPixmap(self, pix):
if (pix in self.dictPix) == True:
pixmap = self.dictPix[pix]
else:
pixmap = Qt.CursorShape.WhatsThisCursor
return pixmap
def getCursorsPixUrl(self):
return self._cursorsPixUrl
def setCursorsPixUrl(self, lista):
print (lista)
self.setCursor(QCursor(QPixmap(lista[0]),lista[1],lista[2]))
cursorsPixUrl = Property("QVariantList", getCursorsPixUrl, setCursorsPixUrl)
if __name__ == '__main__':
app = QApplication(sys.argv)
qmlRegisterType(CursorArea, "Charts", 1, 0, "CursorArea");
view = QDeclarativeView()
view.setSource(QUrl.fromLocalFile('app.qml'))
view.show()
sys.exit(app.exec_())
app.qml:
import Charts 1.0
import QtQuick 1.0
Item {
width: 300; height: 200
CursorArea{
id:ca
anchors.fill: parent
//cursors:Qt.PointingHandCursor
//cursorsPix: "lapizAzul"
cursorsPixUrl: ["cursorEstrella.png",1,32]
}
}
Upvotes: 0
Reputation: 3493
Yes, there is a way, though, not inside of QML as i know, but in c++ part of the program, example of main.cpp file:
QmlApplicationViewer viewer;
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/main.qml"));
viewer.showExpanded();
//changing cursor
viewer.setCursor(QPixmap(":/peach.png").scaledToWidth(20));
or, you can change cursor to qt cursor shapes something like this (not custom cursors, though, you can try to change this magic bit), add these lines to main.cpp
#include "cursorshapearea.h"
qmlRegisterType<QsltCursorShapeArea>("Cursor", 1, 0, "CursorShapeArea");
cursorshapearea.cpp:
#include "cursorshapearea.h"
QsltCursorShapeArea::QsltCursorShapeArea(QDeclarativeItem *parent) :
QDeclarativeItem(parent),
m_currentShape(-1)
{
}
Qt::CursorShape QsltCursorShapeArea::cursorShape() const
{
return cursor().shape();
}
void QsltCursorShapeArea::setCursorShape(Qt::CursorShape cursorShape)
{
if (m_currentShape == (int) cursorShape)
return;
setCursor(cursorShape);
emit cursorShapeChanged();
m_currentShape = cursorShape;
}
cursorshapearea.h:
#ifndef CURSORSHAPEAREA_H
#define CURSORSHAPEAREA_H
#include <QDeclarativeItem>
class QsltCursorShapeArea : public QDeclarativeItem
{
Q_OBJECT
Q_PROPERTY(Qt::CursorShape cursorShape READ cursorShape WRITE setCursorShape NOTIFY cursorShapeChanged)
public:
explicit QsltCursorShapeArea(QDeclarativeItem *parent = 0);
Qt::CursorShape cursorShape() const;
Q_INVOKABLE void setCursorShape(Qt::CursorShape cursorShape);
private:
int m_currentShape;
signals:
void cursorShapeChanged();
};
#endif // CURSORSHAPEAREA_H
and in your QML file:
import Cursor 1.0
and add CursorShapeArea to Rectangle for example:
CursorShapeArea {
anchors.fill: parent
anchors.margins: 50
cursorShape: Qt.OpenHandCursor
}
Upvotes: 4