Frage

Ich schreibe ein Programm, mit dem ich Fotos über ihre API auf Tumblr hochladen kann. Ich habe das Hochladen (dank euch).

Ich habe eine "Queueebox" an die Seite der GUI gestellt, die die Bildnamen anzeigt, und sie werden in einem Qlistwidget gespeichert. Ich habe das in meinen Konstruktor der Hauptklasse eingesetzt:

def __init__(self):
    QtGui.QMainWindow.__init__(self)
    self.setupUi(self)
    self.queueBox.itemClicked.connect(self.displayPhoto)

Und ich habe diese Methode:

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''

Dies zeichnet das Bild erfolgreich auf MyLabel, ein Qlabel, es ist jedoch sehr skaliert, ich habe es

self.myLabel.setScaledContents(True)

In meiner ui_mainWindow -Klasse und wenn ich es zu falsch verwandle, fixiert es die Skalierung, es zeigt jedoch nur einen kleinen Teil des Bildes, da das Bild viel größer ist als das Qlabel. Ich möchte in der Lage sein, das Seitenverhältnis aufrechtzuerhalten, damit es nicht skaliert und schrecklich aussieht.

Ich habe das gefunden: http://www.riverbankcomputing.co.uk/static/docs/pyqt4/html/qpixmap.htmlUnd es heißt, wie man es benutzt, aber ich kann es nicht zum Laufen bringen, wie im obigen Code in meinen Kommentaren gezeigt. Weiß jemand, wie man das benutzt? Wenn ja, können Sie mir ein Beispiel geben, habe ich versucht, zu suchen, aber die meisten Ergebnisse, die ich bekomme, sind Beispiele in C ++, nicht in Python.

Vielen Dank!

War es hilfreich?

Lösung

Loswerden

self.myLabel.setScaledContents(True)

Rufen Sie an (oder setzen Sie es auf false). Es füllt Ihr Widget mit dem PixMap, ohne sich um das Seitenverhältnis zu kümmern.

Wenn Sie die Größe einer Größe haben, a QPixmap, wie Sie gefunden haben, scaled ist die erforderliche Methode. Aber du ruft es falsch an. Schauen wir uns die Definition an:

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

Rückgabetyp dieser Funktion ist QPixmap, also gibt es eine skalierte zurück Kopieren des ursprünglichen Pixmap.

Dann brauchst du eine width und ein height, beschreiben die (maximale) endgültige Größe des PixMap.

Zwei weitere optionale Parameter. aspectRatioMode befasst sich mit dem, weiten Seitenverhältnis. Das Dokumentation Detailliert die verschiedenen Optionen und deren Effekte. transformMode definiert, wie (welcher Algorithmus) die Skalierung erfolgt. Es kann die endgültige Qualität Ihres Bildes ändern. Sie brauchen diesen wahrscheinlich nicht.

Also, zusammenzustellen, sollten Sie haben (Qt Namespace ist drinnen QtCore):

# substitute the width and height to desired values
self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(width, height, QtCore.Qt.KeepAspectRatio))

Alternativ, wenn Sie eine feste Größe haben QLabel, Sie könnten das anrufen .size() Methode, um die Größe daraus zu erhalten:

self.myLabel.setPixmap(QtGui.QPixmap(_fromUtf8(directory + '\\' + tempName)).scaled(self.myLabel.size(), QtCore.Qt.KeepAspectRatio))

Notiz: Sie möchten vielleicht verwenden os.path.join(directory, tempName) für die directory + '\\' + tempName Teil.

Andere Tipps

PYQT5 -Codeänderungsaktualisierung:

Die obige Antwort von Avaris Benötigte ein PYQT5 -Update, weil es bricht.

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

Das halten self Im Code führt zu einem folgenden Traceback -Fehler.

TypeError: Argumente stimmten nicht überlastet: scaled (self, int, int, asspectratiomode: qt.aspectratiomode = qt.ignorepectratio, TransformMode: qt.transformationMode = qt.fasttransformation): Argument 1 hat unerwartete Typ 'Mainui' scaled (scaled (scaled , QSIZE, ASPECRATIOMODE: qt.aspectratiomode = qt.ignoreaspectratio, TransformMode: qt.transformationMode = qt.fasttransformation): Argument 1 hat unerwarteten Typ 'Mainui'

So sollte dies (ohne "Selbst", "qt") sein, wie unten angegeben:

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

oder:

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

Keepectratio = 4 ... aber verwendet wie von bereitgestellt von aspectRatioMode = 4 im obigen Code. Genießen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top