2012-07-12 13 views
5

Zastanawiam się, jak najlepiej skrócić tekst w QLabel na podstawie jego maksymalnej szerokości/wysokości. Przychodzący tekst może mieć dowolną długość, ale aby zachować porządek, chciałbym skrócić długie łańcuchy, aby wypełnić maksymalną ilość miejsca (maksymalna szerokość/wysokość widgetu).PySide/PyQt obcina tekst w QLabel na podstawie minimumSize

Np .:

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

staną:

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

na podstawie wymaganej przestrzeni bieżących potrzeb czcionki.

Jak mogę osiągnąć to najlepiej?

Oto prosty przykład tego, co mi po tym, choć jest to na podstawie liczby słów, a nie wolnego miejsca:

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

Odpowiedz

8

Jeszcze prościej - zastosować metodę QFontMetrics.elidedText i przeciążać paintEvent, oto przykład:

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, to jest bardzo fajne, dzięki! –

+0

@EricHulser, to bardzo bardzo dobra odpowiedź. Bardzo przydatne. Wielkie dzięki! – Phil

0

Można osiąga to poprzez wyznaczenie szerokości z QFontMetrics patrz this answer.

Prawdopodobnie zechcesz użyć lub utworzyć algorytm, który znajdzie miejsce do szybkiego cięcia, chyba że wystarczyłoby zrobić to w prostej pętli for.

+0

słodki, dziękuję! –

Powiązane problemy