Ant*_*rth 15 python pyqt width pyqt4 qlabel
我有一个固定宽度的QLabel.
我需要(定期)检查整个字符串是否适合当前宽度的QLabel内部,因此我可以适当调整它的大小.
为此,我需要获取字符串的"像素长度".
(显示字符串所需的水平像素总数).
应该注意的是,QLabel的点大小永远不会改变.
我不能简单地检查存在的字符数量,因为有些字符是下标/上标,并且对整个字符串的宽度有不同的贡献.
(这就是说像素宽度和字符数量之间没有简单的关系)
这有什么抽象的,超级便利的功能吗?
规格:
Python 2.7.1
PyQt4
Windows 7
ekh*_*oro 23
要获得文本的精确像素宽度,必须使用QFontMetrics.boundingRect.
不要使用QFontMetrics.width,因为它考虑了字符的左右方位.这通常(但不总是)导致结果可以比全像素宽度多或少几个像素.
因此,要计算标签文本的像素宽度,请使用以下内容:
width = label.fontMetrics().boundingRect(label.text()).width()
Run Code Online (Sandbox Code Playgroud)
编辑
有三种不同的QFontMetrics
可以用来计算一个字符串的"宽度"的方法:size()
,width()
和boundingRect()
.
然而,尽管它们都给出了稍微不同的结果,但它们似乎都没有在所有情况下始终返回精确的像素宽度.哪一个最好取决于当前使用的font-family以及字符串开头和结尾的特定字符.
我在下面添加了一个测试这三种方法的脚本.对我来说,该boundingRect
方法给出了最一致的结果.其他两种方法往往略微过宽,或者在使用serif字体时剪切第二个文本样本(这与Linux上的PyQt 4.9和Qt 4.8相同).
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_())
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15227 次 |
最近记录: |