有没有办法在QML中更改光标形状?我正在使用Qt 4.7和Python,所以我不能使用Qt Quick 2,而在Qt Quick中没有光标形状选项。
答案 0 :(得分:4)
是的,有一种方法,但不是我知道的QML内部,但在程序的c ++部分,main.cpp文件的例子:
QmlApplicationViewer viewer;
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/main.qml"));
viewer.showExpanded();
//changing cursor
viewer.setCursor(QPixmap(":/peach.png").scaledToWidth(20));
或者,您可以将光标更改为qt光标形状(不是自定义光标,但您可以尝试更改此魔术位),将这些行添加到 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
并在您的QML文件中:
import Cursor 1.0
并将CursorShapeArea添加到Rectangle中,例如:
CursorShapeArea {
anchors.fill: parent
anchors.margins: 50
cursorShape: Qt.OpenHandCursor
}
答案 1 :(得分:0)
一个例子:
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]
}
}