QML中的光标形状

时间:2013-06-20 09:34:54

标签: python qt qml

有没有办法在QML中更改光标形状?我正在使用Qt 4.7和Python,所以我不能使用Qt Quick 2,而在Qt Quick中没有光标形状选项。

2 个答案:

答案 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]
    }   
}