3

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++での動作例です。

ありがとう!

4

2 に答える 2

10

を取り除く

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拡大縮小されたコピーを返します。

次に、ピックスマップの(最大)最終サイズを表すawidthとaが必要です。height

さらに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

于 2012-02-19T18:38:21.260 に答える
1

PyQt5コード変更の更新:

上記のavarisの回答は、壊れているため、PyQt5の更新が必要でした。

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

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

TypeError:引数がオーバーロードされた呼び出しと一致しませんでした:scaled(self、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 = 2 ...ただしaspectRatioMode = 2、上記のコードで提供されているとおりに使用されます。楽しみ!

于 2017-11-24T15:59:55.213 に答える