C'è un modo per rendere drawText () l'aggiornamento di un QPicture delimitazione rect?
Domanda
Sulla base di un QPicture
dovrebbe aggiornare la sua delimitazione rett. In questo modo:
>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawRect(20,20,50,50)
>>> picture.boundingRect()
QRect(20,20,50,50)
Ma se ne traggo testo su di esso, il rettangolo di delimitazione non viene aggiornata:
>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawText(10,10, "Hello, World!")
>>> picture.boundingRect()
QRect(0,0,0,0)
Ovviamente, non aggiorna il rettangolo di delimitazione.
C'è un modo per rendere più repsect testo elaborato o devo farlo manualmente? (Non troppo difficile, ma spero che Qt mi può aiutare qui.)
Soluzione
Date un'occhiata a questi metodi di sovraccarico, in cui è necessario specificare il rettangolo di delimitazione dopo il parametro di testo (che è apparentemente diverso da quello del rettangolo in posizione del primo argomento):
Disegna il testo dato all'interno della disponibile rettangolo secondo la flag specificati. Il boundingRect (se non nullo) è impostato sul quale la rettangolo di delimitazione deve essere in ordine racchiudere l'intero testo.
QPainter.drawText (1) , QPainter.drawText (2)
Aggiornamento:
Sembra se si desidera generare un rettangolo di delimitazione per il metodo drawText () in anticipo, basta chiamare il metodo boundingRect () su QPainter, che esegue le seguenti operazioni:
Restituisce il rettangolo del il testo così come appare quando viene disegnata all'interno del rettangolo dato con il flag specificati utilizzando il momento carattere set (); cioè la funzione che si dice dove la funzione drawText () sarà disegnare quando somministrato gli stessi argomenti.
Se il testo non si adatta all'interno della data rettangolo utilizzando la specificato bandiere, la funzione restituisce il rettangolo di richiesta.
ho collegato a BoundingRect con uscita QRectF, ma le informazioni si applica alle altre versioni pure.
Quindi, fondamentalmente, passare il risultato di QPainter.boundingRect () nel parametro boundingRect del metodo QPainter.drawText () (il secondo argomento QRect).
Aggiornamento 2:
Mi scuso profusamente per essere così dannatamente denso. Ho dimenticato che drawText funziona in modo diverso in PyQt che in Qt. Il rettangolo di delimitazione viene restituito dalla funzione drawText (non passata in come Qt) e in aggiunta, è necessario specificare le bandiere di allineamento prima di ottenere un rettangolo restituito a voi. (Ho incluso anche il p.end () come da commento di Aaron Digulla):
pic = Qt.QPicture()
p = QtGui.QPainter(pic)
brect = p.drawText(10,10,200,200, QtCore.Qt.AlignCenter, "blah")
p.end()
print brect
print pic.boundingRect()
Ecco l'output:
PyQt4.QtCore.QRect (100, 103, 20, 14)
PyQt4.QtCore.QRect (0, 0, 0, 0)
Quindi, sembra si dovrà impostare il rettangolo di delimitazione da soli, anche se almeno viene restituito a voi da l'uscita del drawText () metodo quando si passa in bandiere.
Questo non sembrare comportamento ideale, che si dovrà impostare il rettangolo di delimitazione da soli. Spero che qualcun altro ha la risposta che state cercando, ma ho il sospetto si consiglia di segnalare questo bug.
Altri suggerimenti
Pittura non cambia la dimensione di qualcosa in Qt. Il motivo principale è questo:
- Un componente deve pittura stessa
- La vernice innesca un ridimensionamento
- Il ridimensionamento innesca la pittura -> ciclo infinito
Così il ridimensionamento deve accadere durante la fase di layout. Dopo di che, i limiti non dovrebbero cambiare.
Per risolvere il problema, utilizzare QFontMetric per capire quanto è grande il testo sta per essere durante o vicino alla costruzione della vostra foto e poi ridimensionare di conseguenza.
[EDIT] Hm ... provare a chiamare end () prima di richiedere il rettangolo di delimitazione. Se funziona, avete trovato un bug (non può vedere un motivo per cui il rettangolo di delimitazione non dovrebbe esistere in quanto si aggiungono elementi ...)