1

有什么方法可以改变 QML 中的光标形状吗?我正在使用 Qt 4.7 和 Python,所以我不能使用 Qt Quick 2,并且在 Qt Quick 中没有光标形状选项。

4

2 回答 2

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");

光标形状区域.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;
}

光标形状区域.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
  }
于 2013-06-20T11:05:43.750 回答
0

一个例子:

主要.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_())

应用程序.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]
    }   
}
于 2016-03-28T20:09:35.000 回答