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
今までは、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_zoom2.py - Gist
- マウスホイールで拡大縮小。
- ステータスバー上のボタンを押しても拡大縮小。
- 中ボタンドラッグ(ホイールボタンドラッグ)でスクロール。
◎ ダメな例も貼っておく。 :
もったいないから、昨日までごちゃごちゃやってた、ダメな例のソースも貼っておく。
_gview_zoom.py - Gist
前述の通り、こちらの例では QGraphicsScene内のItemを拡大縮小することでズーム変更してるのだけど。このやり方では、マウスカーソル位置を基準にして拡大縮小することが最後までできなかったという…。
_gview_zoom.py - Gist
前述の通り、こちらの例では QGraphicsScene内のItemを拡大縮小することでズーム変更してるのだけど。このやり方では、マウスカーソル位置を基準にして拡大縮小することが最後までできなかったという…。
◎ mapToScene()は便利。 :
前述のページを見ていて知ったのだけど。どうやら、mapToScene() や mapFromScene() を使うと、マウスカーソル座標の扱いも楽になるっぽい。
おそらくだけど…。
今まで、シーン内の座標値を得るために、スクロールバーの値を加味して、倍率を掛けて、とか面倒なことをしてたけど。mapToScene() を使ったらそのへんの処理をごっそり削れた。ありがたや。
おそらくだけど…。
- 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%等、キリがいい倍率をテーブルで持っておいて、順々に変化させていくことになるかなと。
浮動小数点の誤差っぽい。
_Python の小数 - Qiita
0.1を10回足しても1にならないソレ。超基本的なことなのに、うっかり忘れてた。
とりあえず、倍率は整数値で持つことに。実際に使う際に 100.0 で割ってから使えばええやろ…。結局最後に割ってるから誤差は残ってるけど、見た目ではどうせ分からんし。
ただ、倍率を増減させる際に 1.2 とか 0.8333 を掛けてるので、結局はやっぱり誤差が溜まってきて、どこかでおかしくなるという…。実際のソレを作る際は、100%、200%、300%等、キリがいい倍率をテーブルで持っておいて、順々に変化させていくことになるかなと。
◎ qAppてのがあったのか。 :
マウスカーソル形状を変える際には、
_QtGui.QApplication.setOverrideCursor()
を使うのだけど。
今までは、
で、今頃になって「qApp というグローバル変数があるぜ」「QApplication.〜 とか書かなくて済むぜ」と知り。コレを使うと以下のように書けるらしい。
ちなみに、カーソル種類は、 _QCursor Class | Qt 4.8 を眺めればなんとなく分かるかなと。ページの真ん中あたりに、画像一覧が。
今までは、
global myApp myApp = QApplication(sys.argv)とかやっておいて、後から、
global myApp myApp.setOverrideCursor(Qt.ClosedHandCursor)として、カーソル形状を変えてたわけで。
で、今頃になって「qApp というグローバル変数があるぜ」「QApplication.〜 とか書かなくて済むぜ」と知り。コレを使うと以下のように書けるらしい。
qApp.setOverrideCursor(Qt.ClosedHandCursor)少し楽になった。
ちなみに、カーソル種類は、 _QCursor Class | Qt 4.8 を眺めればなんとなく分かるかなと。ページの真ん中あたりに、画像一覧が。
[ ツッコむ ]
以上です。