質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4901閲覧

PyQt5: QgraphicsSceneからはみ出た部分を表示する

Ykkykk

総合スコア140

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/09/27 01:36

以下、PyQt自体に対する理解が足りず、分かりにくい質問になってしまい申し訳ありません。

QgraphicsViewという枠の中にQgrtaphicsSceneがあり、その中にQgraphicsItemを設置する、というように理解しております。

現在、CSVファイルから取得した座標をPyQtで作成した座標平面にプロットするようなものを考えており、実際に点をプロットすることまではできています。

QgraphicsViewの大きさよりもQgrtaphicsSceneの大きさを大きく設定しており、座標の値が大きくなると、座標平面から見切れてしまう点がある状態です。

このような場合、スクロールバーを設置して、すべての点が見えるようにする、というような処理はできないのでしょうか?

QgraphicsViewのscale()メソッドを使用して倍率を小さくすると、見切れていた点も含めて全体を表示させることができます。

また、読み込むファイルによっては最大値が異なるため、その都度スクロールバーの長さ(?)が変えられるようにしたいと考えております。

このような処理はPyQtで実現できるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Qt のライブラリの話ですね。

QGraphicsScene::sceneRect() でシーンの大きさを取得できるので、それを QGraphicsView::fitInView() に設定することでシーン全体が表示されるようにスケールされます。

また、QGraphicsScene::sceneRectChanged() というシーンの大きさが変更されたときに送出されるシグナルがあるので、それをスロット関数に結びつけ、その中で QGraphicsView::fitInView() に設定すると、大きさの変更に応じて自動でスケールされると思います。

このような場合、スクロールバーを設置して、すべての点が見えるようにする、というような処理はできないのでしょうか?

QGraphcisView は設定しているシーンがウィジェットの大きさを超えたら、自動でスクロールバーが表示されたはずです。

SceneRect について

  • シーンの大きさを表す。
  • QGraphicsView の表示範囲にも使われる。
  • SceneRect を設定していない場合は、アイテムを追加するとそれが収まるように自動で拡張される。
  • ただし、アイテムを削除しても一度拡張された大きさは自動でもとには戻らない。
  • QGraphicsScene::itemsBoundingRect() ですべてのアイテムが収まる矩形の大きさを取得し、setSceneRect() でシーンの大きさを設定することでアイテムがすべて収まる大きさに設定できる。

投稿2018/09/27 02:33

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ykkykk

2018/09/27 03:11 編集

詳細にご回答いただきありがとうございます。 scale()メソッドで変更されている大きさは、sceneの大きさということになるのでしょうか? また、ご指摘の通り、スクロールバーが自動で生成されてはいるのですが、そのスクロールバーで見ることができる範囲を超えた部分にも点が打たれている状態です。この点が打たれている部分は、sceneの範囲を超えた場所に打たれているということでしょうか?
tiitoi

2018/09/27 03:40

QGraphicsScene はキャンパスで QGraphicsView はビューアーだと思ってください。 QGraphicsView でスケールを設定し表示の仕方を変えても、QGraphicsScene 自体には影響はありません。 例えば、画像をなんらかのビューアーで開いて拡大表示しても、元の画像データに手を加えてるわけではなく、あくまで表示の仕方を変えてるだけですよね。それと同じ仕組みです。 ``` そのスクロールバーで見ることができる範囲を超えた部分にも点が打たれている状態です。この点が打たれている部分は、sceneの範囲を超えた場所に打たれているということでしょうか? ``` コードがないので詳細はわからないですが、スクロールバーで見れるのは SceneRect の範囲です。 通常 SceneRect を設定していなければ、アイテムを追加するたびにすべてのアイテムが含まれるように SceneRect が自動で拡張されるはずなのですが。 なっていないようであれば、setSceneRect(scene.itemsBoundingRect()) としたら、すべてのアイテムが見えるようになりませんか?
Ykkykk

2018/09/27 04:09

ご教示いただいた方法をもとに試してみましたが、すべてが見えるようにはできませんでした。itemsBoundingRectをprintしてみたのですが、大きさが変わっていませんでした。 scene等を設定するクラスと、実際に点々をプロットするクラスを別のモジュールとして作成しており、後者を前者にインポートするようにしているのですが、これが問題なような気がします。
tiitoi

2018/09/27 04:22

コードを貼ることは可能ですか?
Ykkykk

2018/09/27 04:39

貼りたい気持ちは山々なのですが、難しいです。すみません…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問