2012-02-19 39 views
2

私は、APIを使ってTUMBLRに写真をアップロードできるプログラムを書いています。私はアップロード作業をしています(おかげさまで)。QPixmapアスペクト比を維持する

私は、イメージ名を表示する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'' 

このsucessfullyはQLabelでmylabelというの上に画像を描画し、しかし、それは非常にありますスケール、私は私のui_mainWindowクラスで

self.myLabel.setScaledContents(True) 

を持っている、と私はFalseにそれをオンにした場合、それはスケーリングを修正したが、画像がQLabelよりもはるかに大きいので、それが唯一の画像の小さな部分を示しています。私が望むのは、アスペクト比を維持することができるため、スケーリングして恐ろしいように見えません。

私はこれを見つけました:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpixmap.html それを使用する方法は述べていますが、私のコメントで上記のコードに示すように動作させることはできません。誰もこれを使う方法を知っていますか?そうであれば、私は例を提供することができます、私は検索しようとしましたが、私が得た結果のほとんどは、PythonではなくC++での実例です。

ありがとうございます!

答えて

7

self.myLabel.setScaledContents(True) 

コール(またはFalseに設定)を取り除きます。アスペクト比を気にせずにウィジェットにピクスマップを塗りつぶしています。

QPixmapのサイズを変更する必要がある場合は、見つけた通りにscaledが必要です。しかし、あなたはそれを間違って呼びます。のは、定義を見てみましょう:それは、元のピックスマップの縮尺コピーを返すように、この機能の

QPixmap QPixmap.scaled (self, 
         int width, 
         int height, 
         Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio, 
         Qt.TransformationMode transformMode = Qt.FastTransformation) 

戻り値の型は、QPixmapです。

次に、pixmapの(最大)最終サイズを表すwidthheightが必要です。

さらに2つのオプションパラメータ。 aspectRatioModeでは、アスペクト比が良好です。 documentationは、さまざまなオプションとその効果について詳しく説明しています。 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)) 

:あなたはdirectory + '\\' + tempName一部にos.path.join(directory, tempName)を使用する場合があります。

+1

大変ありがとうございます。私はちょっと修正しました: 'self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName))スケーリング(self.myLabel.size()、QtCore.Qt.KeepAspectRatio、QtCore.Qt .SmoothTransformation)) '画像にラベルを合わせるときに品質を向上させるので、「smoothTransformation」を追加しました。しかし、画像が作成されると、ラベルの左側に配置されます。つまり、正方形の場合、ラベルの中央に表示されません。左側に表示されます。ドキュメントを検索して見つかりませんでした私が何をした後に何をするのか? – Anteara

+0

ああ、私は上記のことであまり有益ではなかった。私がしたいのは、ラベルの中央に正方形の画像を置くことです。これは、左とは反対に、残りのウィンドウに比例して見えます。私はあなたに私が意味するものの例を見せます:ご覧のとおり、正方形の画像は中央に比べて左に配置されていますが、ワイドスクリーンの画像は問題ありません。 – Anteara

+0

@Anteara:それは 'QLabel'までです。 Designer(デザイナでUIを設計した場合)または 'self.myLabel.setAlignment(QtCore.Qt.AlignCenter)'を呼び出すことによって、その配置をDesignerに設定するだけです。 – Avaris

0

PyQt5コード変更更新:それは壊れるので

avarisの上記の答えはPyQt5の更新を必要としていました。

QPixmap.scaled (self, int width, int height, Qt.AspectRatioMode aspectRatioMode = Qt.IgnoreAspectRatio 

コードにselfを保存すると、以下のトレースバックエラーが発生します。

TypeError: arguments did not match any overloaded call: scaled(self, int, int, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): argument 1 has unexpected type 'MainUI' scaled(self, QSize, aspectRatioMode: Qt.AspectRatioMode = Qt.IgnoreAspectRatio, transformMode: Qt.TransformationMode = Qt.FastTransformation): argument 1 has unexpected type 'MainUI'

したがって、これは後述するように( "Qtの"、 "自己" なし)であるべきである。

QPixmap.scaled (int width, int height, aspectRatioMode = IgnoreAspectRatio 

または:

QPixmap.scaled (int width, int height, aspectRatioMode = 0) 

KeepAspectRatio = 4 ...しかしとして使用上記のコードでaspectRatioMode = 4が提供しています。楽しい!

関連する問題