mieki256's diary



2016/12/03() [n年前の日記]

#1 [python] PySideのQRubberBandの動作確認

PySideのQRubberBandの動作確認中。

_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

こんな感じになった。
rubberband_test_ss01.gif

動かしてみて分かったけれど、これはグラフィックツール等で使うタイプの選択範囲のソレじゃないなと。おそらく用途としては、エクスプローラ等でファイル選択する時に使う系のラバーバンド、ではないかと。グラフィックツール用のソレが欲しい場合は、自分で実装しないとダメっぽい。

グラフィックツール用の選択範囲に求められる仕様。 :

グラフィックツール用の選択範囲に求められる仕様としては…。
  • 矩形の境界線だけ描いてあればいい。中は塗り潰しをしなくても構わない。
  • 境界線は、蟻の行進(Marching ants)か、XOR表示が望ましい。
  • 境界線の上にマウスカーソルを合わせてドラッグすると、境界線の位置を変更できたりするとありがたい。
そんな感じだろうか。

蟻の行進(Marching ants)てのは、以下が参考になるかと。2D画像編集ツールを使ってる人なら「あー、ハイハイ。アレか」と分かるはず。

_Marching ants - Wikipedia
_Fun with marching ants - Banu Blog

実は意外と実装が面倒…のような気がする。

以上です。

過去ログ表示

Prev - 2016/12 - 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 31

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project