Để 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()
và 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_())
Tôi muốn các vòng bi được xem xét, nhưng vẫn cảm ơn! –
@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
Nó không tính đến chỉ số phụ, phải không? Chỉ cần kích thước điểm? –