Help us understand the problem. What is going on with this article?

QGISでカーソルアイコンを変更する

方法

方法としては3つあります
* QApplication
* QWidget
* QgsMapTool

検証環境

  • Windows 10
  • QGIS
    • 2.18
    • 3.4
  • Pythonコンソール

QApplication

アプリケーション全体のカーソルを上書きしたい場合は、QApplicationに対してカーソルを変更します。
Qtでの変更方法はQApplicationにカーソルを取得・設定できる関数が準備されています。
QGISでは、QApplicationを継承しているQgsApplicationで変更することができます。

hoge.py
from PyQt5.QtCore import Qt
from qgis.core import QgsApplication

app = QgsApplication.instance()

# 処理中的なカーソルに変更する
app.setOverrideCursor(Qt.BusyCursor)

# 元のカーソルを復元
app.restoreOverrideCursor()

QWidget

Qtでは、QWigetごとに変更することが可能なのでそこに対してカーソルを設定することで変更することができます。
QApplicationの方が権限が強いのとQgsMapToolにも負けるときがあるっぽいです。

hoge.py
from PyQt5.QtCore import Qt

widget = iface.mainWindow()
cursor = widget.cursor()

# 処理中的なカーソルに変更する
widget.setCursor(Qt.WaitCursor)

QMapTool

QgsMapToolのカーソルでは、QGISの地図領域の時のみに変更されます。一番影響範囲が少なく強制力がない変更方法になります。
また既存のマップツール(例えばactionPanQgsMapToolPan)のアイコンを変更した場合、元に戻す方法がありません。
処理中は砂時計、その後に矢印に戻す処理をしたいのですが、QgsMapToolQCursorをPythonで取得できないので元に戻すことができません。

hoge.py
from PyQt5.QtCore import Qt

canvas = iface.mapCanvas()
maptool = canvas.mapTool()

# 処理中的なカーソルに変更する
maptool.setCursor(Qt.BusyCursor)

Qtで準備されたものに変更する

Qtでは, Qt.CursorShapeで基本的なカーソルが準備されているものに変更します。

hoge.py
from PyQt5.QtCore import Qt
from qgis.core import QgsApplication

app = QgsApplication.instance()

# 処理中的なカーソルに変更する
app.setOverrideCursor(Qt.WaitCursor)

print("なんか処理する")

# 元に戻す
app.restoreOverrideCursor()

独自カーソルに変更する

hoge.py
from PyQt5.QtCore import Qt, QImage, QPixmap
from PyQt5.QtGui import QCursor
from qgis.core import QgsApplication

app = QgsApplication.instance()

# カーソルに使用する画像をPixmapにする
path = 'cursor.png'
image = QImage(path)
pixmap = QPixmap.fromImage(image)

# 独自カーソルを作成
cursor = QCursor(pixmap)

# 独自カーソルに変更する
app.setOverrideCursor(cursor)

QCursorのオブジェクトを作成しQApplicationに設定することで変更することができます。
QCursorは、QPixmapQBitmapで画像の入力を受け入れています。

備考

今回は処理中に砂時計にしたいということでカーソルの変更を調べました。
全ての所で止めたいので、QApplicationでやっていこうと思います。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした