2011-12-26 45 views
14

Tôi có một nhãn QLabel có chiều rộng cố định.
Tôi cần kiểm tra (định kỳ) toàn bộ chuỗi phù hợp với bên trong QLabel ở độ rộng hiện tại của nó, vì vậy tôi có thể thay đổi kích thước nó một cách thích hợp.Qt - Lấy chiều dài pixel của một chuỗi trong QLabel

Để thực hiện việc này, tôi cần có được 'độ dài pixel' của chuỗi.
(Tổng số lượng pixel ngang bắt buộc để hiển thị chuỗi).
Cần lưu ý rằng kích thước điểm của QLabel không bao giờ thay đổi.

Example of 'Pixel Width' of a string

tôi không thể chỉ đơn giản là kiểm tra số lượng ký tự hiện tại, vì một số nhân vật subscript/superscript và đóng góp khác nhau với độ rộng của toàn bộ chuỗi.
(Điều này là để nói rằng không có mối quan hệ đơn giản giữa chiều rộng pixel và số lượng ký tự)

Có chức năng trừu tượng, siêu triệu tập nào cho điều này không?

Specs:
Python 2.7.1
PyQt4
Windows 7

Trả lời

22

Để có được chính xác pixel chiều rộng của văn bản, bạn phải sử dụng QFontMetrics.boundingRect.

Không sử dụng QFontMetrics.width, vì nó tính đến vòng bi trái và phải của các ký tự. Điều này thường sẽ (nhưng không phải lúc nào) dẫn đến kết quả có thể nhiều hơn hoặc nhiều pixel so với chiều rộng pixel đầy đủ.

Vì vậy, để tính toán pixel chiều rộng của văn bản nhãn, sử dụng một cái gì đó như:

width = label.fontMetrics().boundingRect(label.text()).width() 

EDIT

Có ba QFontMetrics phương pháp khác nhau có thể được sử dụng để tính toán "width "của một chuỗi: size(), width()boundingRect().

Tuy nhiên, mặc dù tất cả đều cho kết quả hơi khác nhau, không ai trong số họ dường như luôn trả lại độ rộng pixel chính xác trong mọi trường hợp. Cái nào tốt nhất phụ thuộc chủ yếu vào họ phông chữ hiện đang sử dụng và các ký tự cụ thể nào ở đầu và cuối của chuỗi.

Tôi đã thêm bên dưới tập lệnh để kiểm tra ba phương pháp. Đối với tôi, phương pháp boundingRect mang lại kết quả nhất quán nhất. Hai phương pháp khác có xu hướng hơi quá rộng hoặc clip mẫu văn bản thứ hai khi sử dụng phông chữ serif (với PyQt 4.9 và Qt 4.8 trên Linux).

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.setAutoFillBackground(True) 
     self.setBackgroundRole(QtGui.QPalette.Mid) 
     self.setLayout(QtGui.QFormLayout(self)) 
     self.fonts = QtGui.QFontComboBox(self) 
     self.fonts.currentFontChanged.connect(self.handleFontChanged) 
     self.layout().addRow('font:', self.fonts) 
     for text in (
      u'H\u2082SO\u2084 + Be', 
      u'jib leaf jib leaf', 
      ): 
      for label in ('boundingRect', 'width', 'size'): 
       field = QtGui.QLabel(text, self) 
       field.setStyleSheet('background-color: yellow') 
       field.setAlignment(QtCore.Qt.AlignCenter) 
       self.layout().addRow(label, field) 
     self.handleFontChanged(self.font()) 

    def handleFontChanged(self, font): 
     layout = self.layout() 
     font.setPointSize(20) 
     metrics = QtGui.QFontMetrics(font) 
     for index in range(1, layout.rowCount()): 
      field = layout.itemAt(index, QtGui.QFormLayout.FieldRole).widget() 
      label = layout.itemAt(index, QtGui.QFormLayout.LabelRole).widget() 
      method = label.text().split(' ')[0] 
      text = field.text() 
      if method == 'width': 
       width = metrics.width(text) 
      elif method == 'size': 
       width = metrics.size(field.alignment(), text).width() 
      else: 
       width = metrics.boundingRect(text).width() 
      field.setFixedWidth(width) 
      field.setFont(font) 
      label.setText('%s (%d):' % (method, width)) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

Tôi muốn các vòng bi được xem xét, nhưng vẫn cảm ơn! –

+0

@AntiEarth. Các vòng bi có thể là âm, vì vậy nếu chúng được đưa vào tài khoản cho mục đích thay đổi kích thước, văn bản nhãn có thể được cắt ở các cạnh. Chỉ 'boundingRect' được đảm bảo luôn cung cấp chiều rộng pixel đầy đủ của văn bản. – ekhumoro

+0

Nó không tính đến chỉ số phụ, phải không? Chỉ cần kích thước điểm? –

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