2012-07-12 7 views
5

Mi chiedo come troncare il testo in una etichetta QL in base alla larghezza/altezza massima. Il testo in arrivo può essere di qualsiasi lunghezza, ma per mantenere un layout ordinato vorrei troncare le stringhe lunghe per riempire una quantità massima di spazio (larghezza/altezza massima del widget).PySide/PyQt troncano il testo in QLabel in base a minimumSize

Es .:

'A very long string where there should only be a short one, but I can't control input to the widget as it's a user given value' 

sarebbe diventato:

'A very long string where there should only be a short one, but ...' 

in base allo spazio necessario alle attuali esigenze di carattere.

Come posso ottenere il massimo?

Ecco un semplice esempio di quello che sto cercando, anche se questo si basa su conteggio delle parole, non disponibile spazio:

import sys 
from PySide.QtGui import * 
from PySide.QtCore import * 


def truncateText(text): 
    maxWords = 10 
    words = text.split(' ') 
    return ' '.join(words[:maxWords]) + ' ...' 

app = QApplication(sys.argv) 

mainWindow = QWidget() 
layout = QHBoxLayout() 
mainWindow.setLayout(layout) 

text = 'this is a very long string, '*10 
label = QLabel(truncateText(text)) 
label.setWordWrap(True) 
label.setFixedWidth(200) 
layout.addWidget(label) 

mainWindow.show() 
sys.exit(app.exec_()) 

risposta

8

Ancora più facile - utilizzare il metodo QFontMetrics.elidedText e sovraccaricare la paintEvent, ecco un esempio:

from PyQt4.QtCore import Qt 
from PyQt4.QtGui import QApplication,\ 
         QLabel,\ 
         QFontMetrics,\ 
         QPainter 

class MyLabel(QLabel): 
    def paintEvent(self, event): 
     painter = QPainter(self) 

     metrics = QFontMetrics(self.font()) 
     elided = metrics.elidedText(self.text(), Qt.ElideRight, self.width()) 

     painter.drawText(self.rect(), self.alignment(), elided) 

if (__name__ == '__main__'): 
    app = None 
    if (not QApplication.instance()): 
     app = QApplication([]) 

    label = MyLabel() 
    label.setText('This is a really, long and poorly formatted runon sentence used to illustrate a point') 
    label.setWindowFlags(Qt.Dialog) 
    label.show() 

    if (app): 
     app.exec_() 
+0

wow, è molto bello, grazie! –

+0

@EricHulser, questa è una risposta molto buona. Molto utile. Molte grazie! – Phil

0

È possibile realizza questo attraverso la determinazione della larghezza con QFontMetrics, vedere this answer.

Probabilmente vorrete usare o creare qualche algoritmo che trovi il posto giusto per tagliare, a meno che non sia sufficiente farlo in un ciclo semplice.

+0

dolce, grazie! –