首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Pyqt5中将Unicode字符对齐到帧的顶部?

如何在Pyqt5中将Unicode字符对齐到帧的顶部?
EN

Stack Overflow用户
提问于 2022-04-10 14:26:29
回答 1查看 42关注 0票数 0

如何将三重行(‘\u 2261’)放置到帧的顶部。我的第一帧是黄色的,Qlabel文本是放在框架顶部的"Python“。同样,我需要将Unicode字符'u\2261'放在第二帧的顶部(浅绿色的顶部边缘)。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-10 19:51:53

这是基于所选字体的字符定位。

因为它是一个位于字体基线上的字符,通常不是很高,所以总是有一定的间距,就像任何其他“小”字符一样,比如"x“或"a”。

QLabel总是尝试显示文本的完整边界矩形,因此唯一的选项是手动强制填充到用当前字体的QFontMetrics计算的负值:您需要用ascent()减去字体的xHeight()

但是,请注意,结果绝对不能保证,因为这完全取决于字体如何绘制特定字符:如果您使用的字体由于某种原因显示字符比其他小字符高,内容可能会被部分隐藏;如果字体较小(或显示在基线下面),则上面仍会有一些空白。

代码语言:javascript
复制
    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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71817503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档