2012-07-12 18 views
5

Me pregunto cómo truncar mejor texto en una QLabel en función de su ancho/alto máximo. El texto entrante puede tener cualquier longitud, pero para mantener un diseño ordenado me gustaría truncar cadenas largas para llenar una cantidad máxima de espacio (ancho/alto máximo del widget).PySide/PyQt truncar texto en QLabel basado en minimumSize

ej .:

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

se convertiría en:

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

basado en el espacio necesario a las necesidades actuales del tipo de letra.

¿Cómo puedo lograr esto mejor?

Aquí es un ejemplo sencillo de lo que busco, aunque esto se basa en el recuento de palabras, no está disponible el espacio:

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_()) 

Respuesta

8

Aún más fácil - utilizar el método QFontMetrics.elidedText y la sobrecarga de la paintEvent, he aquí un ejemplo:

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

guau, eso es genial, gracias! –

+0

@EricHulser, esta es una muy buena respuesta. Muy útil. ¡Muchas gracias! – Phil

0

Puede logra esto a través de la determinación de la anchura con QFontMetrics, ver this answer.

Es probable que desee utilizar o crear algún algoritmo que encuentre el lugar para cortar rápidamente, a menos que hacerlo en un bucle for simple sea suficiente.

+0

dulce, gracias! –