mieki256's diary



2016/11/28(月) [n年前の日記]

#1 [python] PySideでカーソルを変更

QCursor でカーソルを作って、setCursor() でマウスカーソルを変更できる。

_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

実行すると、こんな感じに。マウスクリックでマウスカーソルを変更できる。

qcursor_test_ss01.gif

ソースと画像素材は、CC0 / Public Domain ってことで。

_QCursor - PySide v1.0.7 documentation を読むと、1bit画像を2枚指定する設定の仕方で、xor表示ができる、と書いてあるように見えるのだけど。よくよく読んでみると、Windows では xor表示できるけど他の環境ではどうなるか知らんよ、と書いてあった。となると、クロスプラットフォームを意識して使うなら xor表示は避けたほうがいいのかもしれない。

xor表示ってのは…。おそらくだけど、下地が黒ならマウスカーソルは白に、下地が白ならマウスカーソルが黒に、みたいな表示じゃないかと想像するけど、どうなんだろう。

以上です。

過去ログ表示

Prev - 2016/11 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project