2016/11/28(月) [n年前の日記]
#1 [python] PySideでカーソルを変更
QCursor でカーソルを作って、setCursor() でマウスカーソルを変更できる。
_qcursor_test.py
マウスカーソル画像は以下。EDGE2を使って自作してみたり。
_mouse_cursor_pen.png
_mouse_cursor_eraser.png
_mouse_cursor_picker.png
_mouse_cursor_fill.png
実行すると、こんな感じに。マウスクリックでマウスカーソルを変更できる。

ソースと画像素材は、CC0 / Public Domain ってことで。
_QCursor - PySide v1.0.7 documentation を読むと、1bit画像を2枚指定する設定の仕方で、xor表示ができる、と書いてあるように見えるのだけど。よくよく読んでみると、Windows では xor表示できるけど他の環境ではどうなるか知らんよ、と書いてあった。となると、クロスプラットフォームを意識して使うなら xor表示は避けたほうがいいのかもしれない。
xor表示ってのは…。おそらくだけど、下地が黒ならマウスカーソルは白に、下地が白ならマウスカーソルが黒に、みたいな表示じゃないかと想像するけど、どうなんだろう。
_qcursor_test.py
u"""
QCursorのテスト。マウスカーソルを変更する.
動作確認環境 : Windows10 x64 + Python 2.7.12 + PySide 1.2.4
"""
import sys
from PySide.QtCore import * # NOQA
from PySide.QtGui import * # NOQA
class GView(QGraphicsView):
"""GraphicsView."""
def __init__(self, *argv, **keywords):
"""init."""
super(GView, self).__init__(*argv, **keywords)
scene = QGraphicsScene(self)
self.setScene(scene)
pm = QPixmap(320, 240)
pm.fill(QColor(192, 192, 192, 255))
pitem = QGraphicsPixmapItem(pm)
scene.addItem(pitem)
lst = [
("pen", "./mouse_cursor_pen.png", 0, 0),
("eraser", "./mouse_cursor_eraser.png", 0, 0),
("picker", "./mouse_cursor_picker.png", 9, 22),
("fill", "./mouse_cursor_fill.png", 9, 22),
]
self.curs = []
for d in lst:
name, filepath, hx, hy = d
cur_pm = QPixmap(filepath)
cur = QCursor(cur_pm, hotX=hx, hotY=hy)
self.curs.append(cur)
self.cur_idx = 0
self.setCursor(self.curs[self.cur_idx])
def mousePressEvent(self, event):
u"""マウスボタンが押された時の処理."""
# 左もしくは右ボタンを押したらマウスカーソルを変更
if event.button() == Qt.LeftButton:
self.cur_idx = (self.cur_idx + 1) % len(self.curs)
elif event.button() == Qt.RightButton:
self.cur_idx = (self.cur_idx - 1 + len(self.curs)) % len(self.curs)
else:
return
self.setCursor(self.curs[self.cur_idx]) # マウスカーソルを設定
def mouseReleaseEvent(self, event):
u"""マウスボタンが離された時の処理."""
pass
# self.unsetCursor()
class MyWidget(QWidget):
"""Main Window."""
def __init__(self, *argv, **keywords):
"""init."""
super(MyWidget, self).__init__(*argv, **keywords)
l = QVBoxLayout()
l.addWidget(QLabel("Dummy", self))
l.addWidget(QLabel("Dummy", self))
l.addWidget(GView(self))
l.addWidget(QLabel("Dummy", self))
l.addWidget(QLabel("Dummy", self))
self.setLayout(l)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())
マウスカーソル画像は以下。EDGE2を使って自作してみたり。
_mouse_cursor_pen.png
_mouse_cursor_eraser.png
_mouse_cursor_picker.png
_mouse_cursor_fill.png
実行すると、こんな感じに。マウスクリックでマウスカーソルを変更できる。

ソースと画像素材は、CC0 / Public Domain ってことで。
_QCursor - PySide v1.0.7 documentation を読むと、1bit画像を2枚指定する設定の仕方で、xor表示ができる、と書いてあるように見えるのだけど。よくよく読んでみると、Windows では xor表示できるけど他の環境ではどうなるか知らんよ、と書いてあった。となると、クロスプラットフォームを意識して使うなら xor表示は避けたほうがいいのかもしれない。
xor表示ってのは…。おそらくだけど、下地が黒ならマウスカーソルは白に、下地が白ならマウスカーソルが黒に、みたいな表示じゃないかと想像するけど、どうなんだろう。
[ ツッコむ ]
以上です。