Domanda

Sto scrivendo un programma che mi permetterà di caricare foto su Tumblr tramite la loro API, ho il caricamento funzionante (grazie a voi ragazzi).

Ho messo un "queuebox" sul lato della GUI, che mostra i nomi delle immagini e sono archiviati in un QlistWidget. L'ho messo nel costruttore della mia classe principale:

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

E ho questo metodo:

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

Questo attira con successo l'immagine su Mylabel che è un qlabel, tuttavia è molto ridimensionato, ho

self.myLabel.setScaledContents(True)

Nella mia classe ui_mainwindow, e se lo trasformo in falso, corregge il ridimensionamento ma mostra solo una piccola parte dell'immagine perché l'immagine è molto più grande del qlabel. Quello che voglio è essere in grado di mantenere le proporzioni, quindi non sembra ridimensionato e orribile.

Ho trovato questo: http://www.riverbankcomputing.co.uk/static/docs/pyqt4/html/qpixmap.htmlE dice come usarlo, tuttavia non riesco a farlo funzionare come mostrato nel codice sopra nei miei commenti. Qualcuno sa come usarlo? In tal caso, puoi fornirmi un esempio, ho provato a cercare ma la maggior parte dei risultati che ottengo lavorano in C ++, non Python.

Grazie!

È stato utile?

Soluzione

Sbarazzati del

self.myLabel.setScaledContents(True)

Chiama (o impostalo su False). Sta riempiendo il tuo widget con la mamap di pix senza preoccuparsi del rapporto di aspetto.

Se hai bisogno di ridimensionare un file QPixmap, come hai trovato, scaled è il metodo richiesto. Ma lo stai invocando. Diamo un'occhiata alla definizione:

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

Il tipo di ritorno di questa funzione è QPixmap, quindi restituisce una riduzione copia della fotomap originale.

Allora hai bisogno di un width e a height, descrivendo la dimensione finale (massima) della PIXMAP.

Altri due parametri opzionali. aspectRatioMode si occupa del rapporto, delle proporzioni. Il documentazione dettaglia le diverse opzioni e i loro effetti. transformMode Definisce come (quale algoritmo) viene eseguito il ridimensionamento. Potrebbe cambiare la qualità finale della tua immagine. Probabilmente non hai bisogno di questo.

Quindi, metterlo insieme dovresti avere (Qt Lo spazio dei nomi è dentro QtCore):

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

In alternativa, se hai una dimensione fissa QLabel, potresti chiamare il .size() Metodo per ottenere le dimensioni da esso:

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

Nota: Potresti voler usare os.path.join(directory, tempName) per il directory + '\\' + tempName parte.

Altri suggerimenti

Pyqt5 Codice Modifica aggiornamento:

La risposta di cui sopra di Avaris Aveva bisogno di un aggiornamento PYQT5 perché si rompe.

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

Mantenere il self Nel codice deriva sotto l'errore di Traceback.

TypeEerror: gli argomenti non corrispondevano a nessuna chiamata sovraccarica: scala (self, int, int, aspectratiomode: qt.aspectratiomode = qt.igoreaspectratio, TransformMode: qt.TransformationMode = Qt.FastTransformation): Argomento 1 ha un tipo di controllo non specificato 'mainui' scale (auto , QSize, aspectratiomoDe: qt.aspectratiomoDe = qt.ignoreaspectratio, trasformMode: qt.transformationMode = qt.fastTransformation): Argomento 1 ha un tipo imprevisto 'MainUI'

Quindi questo dovrebbe essere (senza "sé", "qt") come indicato di seguito:

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

o:

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

KeepSpectratio = 4 ... ma usato come fornito da aspectRatioMode = 4 nel codice sopra. Divertiti!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top