如何在 Pyqt5 中将 Unicode 字符对齐到框架的顶部?
How to Align Unicode Character to the Top of the Frame in Pyqt5?
如何将 三重线 ('\u2261') 放置在框架的顶部。我的第一个框架是黄色的,Qlabel 文本是“Python”,放在框架的顶部。同样,我需要将 Unicode 字符 'u61' 放在第二帧的顶部(浅绿色上边缘)。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QLab(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QLabel Example")
self.frame_top = QFrame()
self.frame_top.setObjectName("ob_frame_top")
self.color_top = "yellow"
self.frame_top.setStyleSheet(f"QFrame#ob_frame_top{{background-color: {self.color_top};}}")
self.frame_top.setFixedHeight(30)
self.frame_mid = QFrame()
self.frame_mid.setObjectName("ob_frame_mid")
self.color_mid = "lightgreen"
self.frame_mid.setStyleSheet(f"QFrame#ob_frame_mid{{background-color: {self.color_mid};}}")
self.frame_mid.setFixedHeight( 100)
self.frame_all = QFrame()
self.lay_top = QVBoxLayout()
self.lay_mid = QVBoxLayout()
self.lay_all = QVBoxLayout()
self.lay_top = QVBoxLayout(self.frame_top)
self.lay_mid = QVBoxLayout(self.frame_mid)
self.lay_all = QVBoxLayout(self.frame_all)
lbl1 = QLabel("Python")
self.lay_top.addWidget(lbl1)
self.lay_top.setContentsMargins(0,0,0,0)
self.lay_top.setAlignment(Qt.AlignTop)
lbl2 = QLabel('\u2261'*8)
my_font = QFont("Arial Black", 15)
lbl2.setFont(my_font)
self.lay_mid.addWidget(lbl2)
self.lay_mid.setContentsMargins(0,0,0,0)
self.lay_mid.setAlignment(Qt.AlignTop )
self.lay_mid.addStretch()
self.lay_all.setSpacing(0)
self.lay_all.addWidget(self.frame_top)
self.lay_all.addWidget(self.frame_mid)
self.lay_all.addStretch()
self.setLayout(self.lay_all)
def main():
app = QApplication(sys.argv)
ex = QLab()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
这是根据所选字体的字符定位。
由于它是一个位于字体基线上的字符,通常不是很高,所以上面总会有一定程度的间距,就像任何其他“小”字符,如“x”或“a”一样。
QLabel 总是尝试显示文本的完整边界矩形,因此唯一的选择是手动将填充强制为负值,该负值是根据当前字体的 QFontMetrics 计算得出的:您需要减去字体的 xHeight()
by the ascent()
.
但是请注意,绝对不能保证结果,因为它完全取决于字体如何绘制特定字符:如果您使用的字体出于某种原因显示该字符高于其他小字符,内容可能会被部分隐藏;如果它更小(或显示在基线下方),上面仍然会有一些余量。
lbl2 = QLabel('\u2261'*8)
my_font = QFont("Arial Black", 15)
fm = QFontMetrics(my_font)
padding = fm.xHeight() - fm.ascent()
lbl2.setStyleSheet('margin-top: {}px;'.format(padding))
lbl2.setFont(my_font)
如何将 三重线 ('\u2261') 放置在框架的顶部。我的第一个框架是黄色的,Qlabel 文本是“Python”,放在框架的顶部。同样,我需要将 Unicode 字符 'u61' 放在第二帧的顶部(浅绿色上边缘)。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QLab(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QLabel Example")
self.frame_top = QFrame()
self.frame_top.setObjectName("ob_frame_top")
self.color_top = "yellow"
self.frame_top.setStyleSheet(f"QFrame#ob_frame_top{{background-color: {self.color_top};}}")
self.frame_top.setFixedHeight(30)
self.frame_mid = QFrame()
self.frame_mid.setObjectName("ob_frame_mid")
self.color_mid = "lightgreen"
self.frame_mid.setStyleSheet(f"QFrame#ob_frame_mid{{background-color: {self.color_mid};}}")
self.frame_mid.setFixedHeight( 100)
self.frame_all = QFrame()
self.lay_top = QVBoxLayout()
self.lay_mid = QVBoxLayout()
self.lay_all = QVBoxLayout()
self.lay_top = QVBoxLayout(self.frame_top)
self.lay_mid = QVBoxLayout(self.frame_mid)
self.lay_all = QVBoxLayout(self.frame_all)
lbl1 = QLabel("Python")
self.lay_top.addWidget(lbl1)
self.lay_top.setContentsMargins(0,0,0,0)
self.lay_top.setAlignment(Qt.AlignTop)
lbl2 = QLabel('\u2261'*8)
my_font = QFont("Arial Black", 15)
lbl2.setFont(my_font)
self.lay_mid.addWidget(lbl2)
self.lay_mid.setContentsMargins(0,0,0,0)
self.lay_mid.setAlignment(Qt.AlignTop )
self.lay_mid.addStretch()
self.lay_all.setSpacing(0)
self.lay_all.addWidget(self.frame_top)
self.lay_all.addWidget(self.frame_mid)
self.lay_all.addStretch()
self.setLayout(self.lay_all)
def main():
app = QApplication(sys.argv)
ex = QLab()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
这是根据所选字体的字符定位。
由于它是一个位于字体基线上的字符,通常不是很高,所以上面总会有一定程度的间距,就像任何其他“小”字符,如“x”或“a”一样。
QLabel 总是尝试显示文本的完整边界矩形,因此唯一的选择是手动将填充强制为负值,该负值是根据当前字体的 QFontMetrics 计算得出的:您需要减去字体的 xHeight()
by the ascent()
.
但是请注意,绝对不能保证结果,因为它完全取决于字体如何绘制特定字符:如果您使用的字体出于某种原因显示该字符高于其他小字符,内容可能会被部分隐藏;如果它更小(或显示在基线下方),上面仍然会有一些余量。
lbl2 = QLabel('\u2261'*8)
my_font = QFont("Arial Black", 15)
fm = QFontMetrics(my_font)
padding = fm.xHeight() - fm.ascent()
lbl2.setStyleSheet('margin-top: {}px;'.format(padding))
lbl2.setFont(my_font)