mieki256's diary



2016/10/28(金) [n年前の日記]

#1 [python] PySideでズーム変更処理をまだ書いてたり

_QGraphicsView - PySide v1.0.7 documentation を眺めてたら、 _scale というメソッドがあることに気が付いて。これは…もしかして…。

今までは、QGraphicsScene 内の各Itemを拡大縮小表示させることでズーム変更をしていたけど。もしかして QGraphicsView の scale を使えば、まとめてズーム変更できるんじゃないか、と思えてきたので試したり。

scaleの使い方は、以下のやり取りが参考になった。というか、そのものズバリの PyQt版のサンプルも投稿されていて助かった。

_c++ - QGraphicsView Zooming in and out under mouse position using mouse wheel - Stack Overflow

こんな感じになった。 :

自分で書いてみたら、こんな感じになった。…ソースが長くなってしまったので、Gistに貼ってみたり。

_gview_zoom2.py - Gist



  • マウスホイールで拡大縮小。
  • ステータスバー上のボタンを押しても拡大縮小。
  • 中ボタンドラッグ(ホイールボタンドラッグ)でスクロール。
マウスカーソル位置を基準にして拡大縮小するようにもなったし、マウスカーソル位置に常時画像を表示することもできてる。これならイイ感じ。

ダメな例も貼っておく。 :

もったいないから、昨日までごちゃごちゃやってた、ダメな例のソースも貼っておく。

_gview_zoom.py - Gist

前述の通り、こちらの例では QGraphicsScene内のItemを拡大縮小することでズーム変更してるのだけど。このやり方では、マウスカーソル位置を基準にして拡大縮小することが最後までできなかったという…。

mapToScene()は便利。 :

前述のページを見ていて知ったのだけど。どうやら、mapToScene() や mapFromScene() を使うと、マウスカーソル座標の扱いも楽になるっぽい。

おそらくだけど…。
  • mapToScene() は、QGraphicsView 用の座標値を、QGraphicsScene 内での座標値に変換するメソッド。
  • mapFromScene() は、QGraphicsScene用の座標値を、QGraphicsView用の座標値に変換するメソッド。
なのではないか。たぶん。違うのかな。どうなんだろ。英語分かりません。

今まで、シーン内の座標値を得るために、スクロールバーの値を加味して、倍率を掛けて、とか面倒なことをしてたけど。mapToScene() を使ったらそのへんの処理をごっそり削れた。ありがたや。

浮動小数点の誤差で悩んだり。 :

ズーム変更を何度も繰り返していたら、倍率が100%に戻らず、99%になってしまって悩んだり。print で変数の値を表示しても100%(1.0)なのに、アプリ上の表示は99%になる。なんでや。Qtのバグなのかコレ。

浮動小数点の誤差っぽい。

_Python の小数 - Qiita

0.1を10回足しても1にならないソレ。超基本的なことなのに、うっかり忘れてた。

とりあえず、倍率は整数値で持つことに。実際に使う際に 100.0 で割ってから使えばええやろ…。結局最後に割ってるから誤差は残ってるけど、見た目ではどうせ分からんし。

ただ、倍率を増減させる際に 1.2 とか 0.8333 を掛けてるので、結局はやっぱり誤差が溜まってきて、どこかでおかしくなるという…。実際のソレを作る際は、100%、200%、300%等、キリがいい倍率をテーブルで持っておいて、順々に変化させていくことになるかなと。

qAppてのがあったのか。 :

マウスカーソル形状を変える際には、 _QtGui.QApplication.setOverrideCursor() を使うのだけど。

今までは、
global myApp
myApp = QApplication(sys.argv)
とかやっておいて、後から、
global myApp
myApp.setOverrideCursor(Qt.ClosedHandCursor)
として、カーソル形状を変えてたわけで。

で、今頃になって「qApp というグローバル変数があるぜ」「QApplication.〜 とか書かなくて済むぜ」と知り。コレを使うと以下のように書けるらしい。
qApp.setOverrideCursor(Qt.ClosedHandCursor)
少し楽になった。

ちなみに、カーソル種類は、 _QCursor Class | Qt 4.8 を眺めればなんとなく分かるかなと。ページの真ん中あたりに、画像一覧が。

#2 [prog][neta] ある範囲に数値を収めるソレ

変数が持ってる数値を、ある範囲内に収めたい時、今までこういう書き方をしてたのですけど。
if a < 0:
    a = 0
if a > 100:
    a = 100

分かりやすいからコレはコレで、とは思うものの、なんだかダサいよなと。もっと短く書けないものか。

と思ってたら、以下のような書き方を見かけて。
a = max(0, min(a, 3200))

なるほど…。4行が1行で済むのだな…。

でも、分かりやすさがちょっと落ちるし、関数だかメソッドだかを2回呼ぶのもどうなの、という気も。ソースの見た目は短くなっても、内部処理的にはむしろ長くなってないか。

まあ、どっちでもいいか…。

#3 [nitijyou] 日記をアップロード

気付いたら、約2ヶ月ほど日記をアップロードしてなかった…。たしか、2016/09/03にアップしたまま忘れてたようで。ということで、今頃まとめてアップロード。

変な文章を書いてないか、読み返して修正するのが面倒臭くて…。いや、まあ、「読み返してコレかよ」と言われそうな気もするけど。

以上、1 日分です。

過去ログ表示

Prev - 2016/10 - 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