QPIXMAPはアスペクト比を維持します
-
27-10-2019 - |
質問
私は彼らのAPIを介してTumblrに写真をアップロードできるプログラムを書いています、私は(皆さんのおかげで)アップロードを機能させました(皆さんのおかげで)。
画像名を表示するGUIの側面に「Queuebox」を置き、それらはQlistWidgetに保存されます。私はこれを私のメインクラスの「コンストラクター」に入れました:
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.queueBox.itemClicked.connect(self.displayPhoto)
そして、私はこの方法を持っています:
def displayPhoto(self, item):
tempName = (item.text())
print tempName
self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)))
## self.myLabel.pixmap(QPixmap.scaled(aspectRatioMode = Qt.IgnoreAspectRatio))
## ^ ^ ^ What do I do with this? How do I set it to maintain aspect ratio?
## Currently it says ''NameError: global name 'Qt' is not defined''
これにより、QlabelであるMyLabelに画像が描かれますが、非常にスケーリングされています。
self.myLabel.setScaledContents(True)
私のui_mainwindowクラスでは、falseに変換するとスケーリングを修正しますが、画像がqlabelよりもはるかに大きいため、画像のごく一部しか表示されません。私が望んでいるのは、アスペクト比を維持できることです。そのため、スケーリングと恐ろしいように見えません。
私はこれを見つけました: http://www.riverbankcomputing.co.uk/static/docs/pyqt4/html/qpixmap.htmlそして、それを使用する方法を述べていますが、私のコメントに上記のコードに示されているように、私はそれを動作させることはできません。誰かがこれを使用する方法を知っていますか?もしそうなら、私に例を提供していただけますか、私は検索を試みましたが、私が得た結果のほとんどは、PythonではなくC ++の例です。
ありがとう!
解決
を取り除きます
self.myLabel.setScaledContents(True)
呼び出します(またはfalseに設定します)。アスペクト比を気にせずにウィジェットをPIXMAPで埋めています。
サイズを変更する必要がある場合 QPixmap
, 、あなたが見つけたように、 scaled
必要な方法です。しかし、あなたはそれを間違って呼びかけています。定義を見てみましょう:
QPixmap QPixmap.scaled (self,
int width,
int height,
Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio,
Qt.TransformationMode transformMode = Qt.FastTransformation)
この関数の返品タイプはです QPixmap
, 、したがって、スケーリングを返します コピー 元のpixmapの。
その後、あなたは必要です width
そしてa height
, 、PIXMAPの(最大)最終サイズを記述します。
さらに2つのオプションのパラメーター。 aspectRatioMode
井戸のアスペクト比を扱います。 ドキュメンテーション さまざまなオプションとその効果を詳述します。 transformMode
スケーリングの実行方法(どのアルゴリズム)が実行されるかを定義します。画像の最終品質を変える可能性があります。おそらくこれは必要ありません。
だから、それをまとめるべきです(あなたは持っている必要があります(Qt
名前空間は中にあります QtCore
):
# substitute the width and height to desired values
self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(width, height, QtCore.Qt.KeepAspectRatio))
または、固定サイズがある場合 QLabel
, 、電話することができます .size()
そこからサイズを取得する方法:
self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(self.myLabel.size(), QtCore.Qt.KeepAspectRatio))
ノート: :使用したい場合があります os.path.join(directory, tempName)
のために directory + '\\' + tempName
部。
他のヒント
pyqt5コードの変更更新:
上記の答え アバリス 壊れるため、pyqt5アップデートが必要でした。
QPixmap.scaled (self, int width, int height, Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio
維持 self
コードでは、トレースバックエラー以下で結果が得られます。
タイプエラー:引数は過負荷の呼び出しと一致しませんでした:scaled(self、int、int、int、aspectratiomode:qt.aspectratiomode = qt.ignoreaspectratio、transformmode:qt.transformationmode = qt.fasttransformation):引数1は予期しないタイプ 'mainui' scaled(self) 、qsize、aspectratiomode:qt.aspectratiomode = qt.ignoreaspectratio、transformmode:qt.transformationmode = qt.fasttransformation):引数1には予期しないタイプ 'mainui'があります。
したがって、これは(「自己」、「QT」なしで)でなければなりません。
QPixmap.scaled (int width, int height, aspectRatioMode = IgnoreAspectRatio
また:
QPixmap.scaled (int width, int height, aspectRatioMode = 0)
keepaspectratio = 4 ...しかし、提供されているように使用されます aspectRatioMode = 4
上記のコードで。楽しみ!