Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@ikura1

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

More than 1 year has passed since last update.

方法

方法としては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でやっていこうと思います。

参考

0
Help us understand the problem. What is going on with this article?
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
ikura1
Pythonなんもわからん

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?