C'è un modo per rendere drawText () l'aggiornamento di un QPicture delimitazione rect?

StackOverflow https://stackoverflow.com/questions/792521

  •  16-09-2019
  •  | 
  •  

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.)

È stato utile?

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.

QPainter.boundingRect

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 ...)

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