2012-07-12 24 views
5

Tôi tự hỏi làm thế nào để cắt ngắn văn bản tốt nhất trong một QLabel dựa trên chiều rộng/chiều cao tối đa của nó. Văn bản đến có thể có độ dài bất kỳ, nhưng để giữ một bố cục gọn gàng, tôi muốn cắt ngắn các chuỗi dài để lấp đầy một khoảng trống tối đa (chiều rộng/chiều cao tối đa của tiện ích).PySide/PyQt cắt ngắn văn bản trong QLabel dựa trên minimumSize

ví dụ .:

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

sẽ trở thành:

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

dựa trên khoảng không đòi hỏi nhu cầu phông chữ hiện hành.

Làm thế nào tôi có thể đạt được điều này tốt nhất?

Đây là một ví dụ đơn giản về những gì tôi là sau đó, mặc dù điều này được dựa trên số lượng từ, không gian có sẵn:

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

Trả lời

8

Thậm chí dễ dàng hơn - sử dụng phương pháp QFontMetrics.elidedText và quá tải paintEvent, đây là một ví dụ:

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, rất tuyệt, cảm ơn! –

+0

@EricHulser, đây là một câu trả lời rất hay. Rất hữu dụng. Cảm ơn rất nhiều! – Phil

0

Bạn có thể đạt được điều này thông qua việc xác định chiều rộng với QFontMetrics, xem this answer.

Bạn có thể muốn sử dụng hoặc tạo một số thuật toán tìm địa điểm để cắt nhanh, trừ khi thực hiện nó trong vòng lặp đơn giản sẽ là đủ.

+0

ngọt ngào, cảm ơn bạn! –

Các vấn đề liên quan