2011-12-26 18 views
14

Sabit bir genişliğe sahip bir QLabel'ım var.
Tüm dizenin geçerli genişlikteki QLabel içine sığacağını (periyodik olarak) kontrol etmem gerekiyor, böylece uygun şekilde yeniden boyutlandırabilirim.Qt - Bir dizginin piksel uzunluğunu QLabel olarak alın

Bunu yapmak için dizenin 'piksel uzunluğunu' almam gerekir.
(Dizeyi görüntülemek için gereken toplam yatay piksel miktarı).
QLabel'in nokta boyutunun hiçbir zaman değişmediğine dikkat edilmelidir. Bazı karakterleri üst simge/simge ve tüm dize genişliğine farklı şekillerde katkıda bulunurlar çünkü

Example of 'Pixel Width' of a string

Sadece, mevcut karakter miktarı kontrol edemez.
(Bu, piksel genişliği ile karakter miktarı arasında basit bir ilişki olmadığını gösterir)

Bunun için soyut, süper bir çağrıştırma işlevi var mı?

Özellikleri:
Python 2.7.1
PyQt4
Windows 7

cevap

22

metnin hassas piksel genişliğini almak için, QFontMetrics.boundingRect kullanmalıdır.

QFontMetrics.width'u kullanmayın, çünkü karakterlerin sol ve sağ yatağını dikkate alır. Bu genellikle (ancak her zaman değil), tam piksel genişliğinden daha fazla veya daha az sayıda piksel olabilecek sonuçlara yol açacaktır. "Genişliğini hesaplamak için kullanılabilecek üç farklı QFontMetrics yöntem vardır

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

EDIT:

Yani, etiket metninin piksel genişliğini hesaplamak için, böyle bir şey kullanmak "bir dizenin: size(), width() ve boundingRect().

Bununla birlikte, hepsinin biraz farklı sonuçlar vermesine rağmen, bunlardan hiçbiri, her koşulda kesin piksel genişliğini sürekli olarak döndürüyor gibi görünüyor. Hangisinin en iyisi çoğunlukla kullanılan yazı tipi ailesine ve hangi karakterlerin dizenin başında ve sonunda olduğuna bağlıdır.

Üç yöntemi sınayan bir komut dosyasının altına ekledim. Benim için boundingRect yöntemi en tutarlı sonuçları verir. Diğer iki yöntem, biraz fazla geniş olma eğilimindedir veya bir serif yazı tipi kullanıldığında ikinci metin örneğini keser (bu, Linux'ta PyQt 4.9 ve Qt 4.8 ile).

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

Yatakların dikkate alınmasını istiyorum, ancak yine de teşekkürler! –

+0

@AntiEarth. Rulmanlar negatif olabilir, bu nedenle yeniden boyutlandırma amacıyla dikkate alınırlarsa, etiket metni kenarlarda kırpılabilir. Metnin tam piksel genişliğini her zaman vermek için yalnızca 'boundingRect' garanti edilir. – ekhumoro

+0

Aboneliği hesaba katmaz, değil mi? Sadece nokta boyutu? –