2016/12/03(土) [n年前の日記]
#1 [python] PySideのQRubberBandの動作確認
PySideのQRubberBandの動作確認中。
_rubberband_test.py
テスト画像。 _tmp_bg.png
こんな感じになった。
動かしてみて分かったけれど、これはグラフィックツール等で使うタイプの選択範囲のソレじゃないなと。おそらく用途としては、エクスプローラ等でファイル選択する時に使う系のラバーバンド、ではないかと。グラフィックツール用のソレが欲しい場合は、自分で実装しないとダメっぽい。
 _rubberband_test.py
u"""
QRubberBandの動作確認.
動作確認環境 : 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):
    """Graphics View."""
    def __init__(self, *argv, **keywords):
        """init."""
        super(GView, self).__init__(*argv, **keywords)
        scene = QGraphicsScene(self)
        self.setScene(scene)
        pm = QPixmap("./tmp_bg.png")
        pm_item = QGraphicsPixmapItem(pm)
        scene.addItem(pm_item)
        # ラバーバンドを生成
        self.rband = QRubberBand(QRubberBand.Rectangle, self)
        self.start_pos = QPoint()
    def mousePressEvent(self, event):
        u"""マウスボタンが押された."""
        if event.button() == Qt.LeftButton:
            # 左ボタンが押された
            self.start_pos = event.pos()  # クリックした座標を記憶
            rect = QRect(self.start_pos, QSize())
            self.rband.setGeometry(rect)  # ラバーバンドの範囲を設定
            self.rband.show()  # ラバーバンドを表示
            p0 = self.mapToScene(self.start_pos)
            x0 = p0.x()
            y0 = p0.y()
            self.set_status("(%d, %d)" % (x0, y0))
        elif event.button() == Qt.RightButton:
            # 右ボタンが押された
            self.rband.hide()  # ラバーバンドを非表示に
    def mouseMoveEvent(self, event):
        u"""マウスカーソルが動いた."""
        if not self.start_pos.isNull():
            # マウスクリック後の状態
            rect = QRect(self.start_pos, QPoint(event.pos())).normalized()
            self.rband.setGeometry(rect)  # ラバーバンドの範囲を再設定
            # ステータスバー相当に座標を表示
            p0 = self.mapToScene(self.start_pos)
            x0 = p0.x()
            y0 = p0.y()
            p1 = self.mapToScene(event.pos())
            x1 = p1.x()
            y1 = p1.y()
            dx = abs(x1 - x0)
            dy = abs(y1 - y0)
            self.set_status("(%d, %d) - (%d, %d) : (%d x %d)" %
                            (x0, y0, x1, y1, dx, dy))
    def mouseReleaseEvent(self, event):
        u"""マウスボタンが離された."""
        if event.button() == Qt.LeftButton:
            self.start_pos = QPoint()
    def set_status(self, str):
        u"""ステータスバー相当のテキストを設定."""
        self.parent().set_status(str)
class MyWidget(QWidget):
    u"""メインウインドウ相当."""
    def __init__(self, *argv, **keywords):
        """init."""
        super(MyWidget, self).__init__(*argv, **keywords)
        self.gview = GView(self)
        self.lbl = QLabel("Ready", self)
        l = QVBoxLayout()
        l.addWidget(self.gview)
        l.addWidget(self.lbl)
        self.setLayout(l)
    def set_status(self, str):
        u"""ステータスバー相当にテキストを設定."""
        self.lbl.setText(str)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())
テスト画像。 _tmp_bg.png
こんな感じになった。
動かしてみて分かったけれど、これはグラフィックツール等で使うタイプの選択範囲のソレじゃないなと。おそらく用途としては、エクスプローラ等でファイル選択する時に使う系のラバーバンド、ではないかと。グラフィックツール用のソレが欲しい場合は、自分で実装しないとダメっぽい。
◎ グラフィックツール用の選択範囲に求められる仕様。 :
グラフィックツール用の選択範囲に求められる仕様としては…。
蟻の行進(Marching ants)てのは、以下が参考になるかと。2D画像編集ツールを使ってる人なら「あー、ハイハイ。アレか」と分かるはず。
_Marching ants - Wikipedia
_Fun with marching ants - Banu Blog
実は意外と実装が面倒…のような気がする。
- 矩形の境界線だけ描いてあればいい。中は塗り潰しをしなくても構わない。
 - 境界線は、蟻の行進(Marching ants)か、XOR表示が望ましい。
 - 境界線の上にマウスカーソルを合わせてドラッグすると、境界線の位置を変更できたりするとありがたい。
 
蟻の行進(Marching ants)てのは、以下が参考になるかと。2D画像編集ツールを使ってる人なら「あー、ハイハイ。アレか」と分かるはず。
_Marching ants - Wikipedia
_Fun with marching ants - Banu Blog
実は意外と実装が面倒…のような気がする。
[   ツッコむ ]
以上です。
