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

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

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

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

Qt

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

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

1回答

5457閲覧

PyQt5にてQt Designerで設置したgraphicsViewに画像ファイルをフィットさせる方法について

Crew_38

総合スコア5

Python 3.x

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

Qt

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

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2021/07/12 13:59

前提・実現したいこと

Qt Designerで設置したgraphicsViewに画像ファイルをフィットさせるようと試みています。
ボタンによってリンク先の画像ファイルを切り替え表示させる事を実装中、
最初の画像のみgraphicsViewの中心に小さく表示され、次回以降はフィットした状態で表示されます

最初からフィットさせた状態で表示させたいです。

発生している問題・エラーメッセージ

具体的に以下のような流れで表示されます

最初の画面
イメージ説明

次の画面
イメージ説明

最初の画面に戻る
イメージ説明

該当のソースコード

メイン

python

1 2import os 3import sys 4 5from PyQt5 import QtWidgets, uic 6from PyQt5 import QtCore as Qc 7from PyQt5 import QtGui as Qg 8from PyQt5 import QtWidgets as Qw 9from PyQt5.Qt import * 10 11import GUI 12 13# ########################################################################### # 14# ########################################################################### # 15class MyForm(QtWidgets.QMainWindow): 16 def __init__(self, parent=None): 17 super().__init__(parent) 18 self.ui = GUI.Ui_Form() 19 self.ui.setupUi(self) 20 21 global ImageFile 22 ImageFile = [] 23 ImageFile.append(r'C:\test\20210712\ImageFile\Penguins.jpg') 24 ImageFile.append(r'C:\test\20210712\ImageFile\Koala.jpg') 25 ImageFile.append(r'C:\test\20210712\ImageFile\Desert.jpg') 26 27 global n 28 n = 0 29 30 self.view = Qw.QGraphicsView() 31 self.scene = Qw.QGraphicsScene() 32 self.srect = self.view.rect() 33 34 self.scene.clear() 35 pic_Item = Qw.QGraphicsPixmapItem(Qg.QPixmap(ImageFile[n])) 36 37 self.scene.addItem(pic_Item) 38 39 self.ui.graphicsView.setScene(self.scene) 40 self.ui.graphicsView.fitInView(self.scene.sceneRect(), Qc.Qt.KeepAspectRatio) 41 42 # //////////////////////////////////////////////////////////////// # 43 def MyFuncBefore(self): 44 global n 45 n = n - 1 46 47 self.view = Qw.QGraphicsView() 48 self.scene = Qw.QGraphicsScene() 49 self.srect = self.view.rect() 50 51 self.scene.clear() 52 pic_Item = Qw.QGraphicsPixmapItem(Qg.QPixmap(ImageFile[n])) 53 self.scene.addItem(pic_Item) 54 55 self.ui.graphicsView.setScene(self.scene) 56 self.ui.graphicsView.fitInView(self.scene.sceneRect(), Qc.Qt.KeepAspectRatio) 57 58 # //////////////////////////////////////////////////////////////// # 59 def MyFuncNext(self): 60 global n 61 n = n + 1 62 63 self.view = Qw.QGraphicsView() 64 self.scene = Qw.QGraphicsScene() 65 self.srect = self.view.rect() 66 67 68 self.scene.clear() 69 pic_Item = Qw.QGraphicsPixmapItem(Qg.QPixmap(ImageFile[n])) 70 self.scene.addItem(pic_Item) 71 72 self.ui.graphicsView.setScene(self.scene) 73 self.ui.graphicsView.fitInView(self.scene.sceneRect(), Qc.Qt.KeepAspectRatio) 74 75 76 77# ########################################################################### # 78# ########################################################################### # 79if __name__ == '__main__': 80 app = Qw.QApplication(sys.argv) 81 wmain = MyForm() 82 wmain.show() 83 sys.exit(app.exec_()) 84

Qt Designerで作成した uiファイルを変換

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'GUI.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(502, 295) Form.setMinimumSize(QtCore.QSize(0, 0)) Form.setMaximumSize(QtCore.QSize(950, 525)) font = QtGui.QFont() font.setPointSize(14) Form.setFont(font) self.graphicsView = QtWidgets.QGraphicsView(Form) self.graphicsView.setGeometry(QtCore.QRect(10, 30, 320, 240)) font = QtGui.QFont() font.setPointSize(10) self.graphicsView.setFont(font) self.graphicsView.setObjectName("graphicsView") self.pushBtnCheckNext = QtWidgets.QPushButton(Form) self.pushBtnCheckNext.setGeometry(QtCore.QRect(350, 120, 121, 51)) font = QtGui.QFont() font.setPointSize(18) self.pushBtnCheckNext.setFont(font) self.pushBtnCheckNext.setObjectName("pushBtnCheckNext") self.pushBtnCheckBefore = QtWidgets.QPushButton(Form) self.pushBtnCheckBefore.setGeometry(QtCore.QRect(350, 60, 121, 51)) font = QtGui.QFont() font.setPointSize(18) self.pushBtnCheckBefore.setFont(font) self.pushBtnCheckBefore.setObjectName("pushBtnCheckBefore") self.retranslateUi(Form) self.pushBtnCheckBefore.clicked.connect(Form.MyFuncBefore) self.pushBtnCheckNext.clicked.connect(Form.MyFuncNext) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.pushBtnCheckNext.setText(_translate("Form", "次")) self.pushBtnCheckBefore.setText(_translate("Form", "前")) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())

試したこと

言語は異なりますが、以下のサイトと同じ状態です。
リンク内容

初学のため知見が浅く、大変申し訳ありませんがアドバイスを頂けないでしょうか。

補足情報(FW/ツールのバージョンなど)

Windows10 21H1 Pro 64bit
Python3.7.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点: 最初の画像は __init__ 内で設定されているので、
ウィジェットが実際に描画される前に、fitInView ビューにサイズを合わせる
→ ビューのサイズが決定していない為、画像は小さくなる。

といった症状です。

確認方法:
print(self.scene.sceneRect()) は、__init__ だと空の領域を返します。

解決策としては、最初の画像の設定を、ウィンドウ描画後に遅らせる事で、
正しいビューのサイズを所得出来るようになり、fitInView で期待通り画像がリサイズされます。

その他の問題点:

  • QGraphicsView, QGraphicsScene は再利用できるので、複数回呼び出す必要はありません。

python

1## __init__内 2 3 self.view = self.ui.graphicsView # GraphicsView は ui 内で作られている 4 self.scene = Qw.QGraphicsScene() # Scene のみ作成・設定 5 self.ui.graphicsView.setScene(self.scene) 6 7 self.n = -1 # 初期値を-1 にすることで、MyFuncNext で ImageFile[0] を読み込む 8 9 # タイマーで app.exec_() が実行された後に MyFuncNext を呼び出し。 10 from PyQt5.QtCore import QTimer 11 QTimer.singleShot(1, self.MyFuncNext) 12 13 14## MyFuncNext, MyFuncBefore 内の以下の行は不要なので削除します 15 16 self.view = Qw.QGraphicsView() 17 self.scene = Qw.QGraphicsScene() 18 self.srect = self.view.rect() 19 20 self.ui.graphicsView.setScene(self.scene) 21 22## グローバル変数 global n -> インスタンス変数 self.n に変更 23# グローバル変数は極力避けた方が良いです。 24# 他の場所で書き換えられた時、意図しない挙動を引き起こします。 25# インスタンス変数(self.n) と ローカル変数 (n) を同時に設定。 26 27 self.n = n = self.n + 1 # MyFuncNext内 28 self.n = n = self.n - 1 # MyFuncBefore内 29

投稿2021/07/13 04:20

teamikl

総合スコア8760

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

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

Crew_38

2021/07/14 19:27

ご連絡ありがとうございます。 丁寧なコードも頂き、行いたことが無事にできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問