方法
方法としては3つあります
* QApplication
* QWidget
* QgsMapTool
検証環境
- Windows 10
- QGIS
- 2.18
- 3.4
- Pythonコンソール
QApplication
アプリケーション全体のカーソルを上書きしたい場合は、QApplication
に対してカーソルを変更します。
Qtでの変更方法はQApplication
にカーソルを取得・設定できる関数が準備されています。
QGISでは、QApplication
を継承しているQgsApplication
で変更することができます。
from PyQt5.QtCore import Qt
from qgis.core import QgsApplication
app = QgsApplication.instance()
# 処理中的なカーソルに変更する
app.setOverrideCursor(Qt.BusyCursor)
# 元のカーソルを復元
app.restoreOverrideCursor()
QWidget
Qtでは、QWiget
ごとに変更することが可能なのでそこに対してカーソルを設定することで変更することができます。
QApplication
の方が権限が強いのとQgsMapTool
にも負けるときがあるっぽいです。
from PyQt5.QtCore import Qt
widget = iface.mainWindow()
cursor = widget.cursor()
# 処理中的なカーソルに変更する
widget.setCursor(Qt.WaitCursor)
QMapTool
QgsMapToolのカーソルでは、QGISの地図領域の時のみに変更されます。一番影響範囲が少なく強制力がない変更方法になります。
また既存のマップツール(例えばactionPan
のQgsMapToolPan
)のアイコンを変更した場合、元に戻す方法がありません。
処理中は砂時計、その後に矢印に戻す処理をしたいのですが、QgsMapTool
のQCursor
をPythonで取得できないので元に戻すことができません。
from PyQt5.QtCore import Qt
canvas = iface.mapCanvas()
maptool = canvas.mapTool()
# 処理中的なカーソルに変更する
maptool.setCursor(Qt.BusyCursor)
Qtで準備されたものに変更する
Qtでは, Qt.CursorShape
で基本的なカーソルが準備されているものに変更します。
from PyQt5.QtCore import Qt
from qgis.core import QgsApplication
app = QgsApplication.instance()
# 処理中的なカーソルに変更する
app.setOverrideCursor(Qt.WaitCursor)
print("なんか処理する")
# 元に戻す
app.restoreOverrideCursor()
独自カーソルに変更する
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
は、QPixmap
とQBitmap
で画像の入力を受け入れています。
備考
今回は処理中に砂時計にしたいということでカーソルの変更を調べました。
全ての所で止めたいので、QApplication
でやっていこうと思います。
参考
- QGis Document
- Qt Document