如何更改文本的笔画粗细?

Posted

技术标签:

【中文标题】如何更改文本的笔画粗细?【英文标题】:How to change the stroke thickness of a text? 【发布时间】:2020-04-02 06:47:48 【问题描述】:

我想改变文字的粗细。

在css中有一个属性

-webkit-text-stroke-width

PyQt5 中是否有类比

将字体更改为更细的字体不是一种选择,因为我使用了一种没有粗斜体版本等的独特字体。

import sys
from PyQt5.QtWidgets import (QRadioButton, QHBoxLayout, QButtonGroup, 
    QApplication, QGraphicsScene,QGraphicsView, QGraphicsLinearLayout, QGraphicsWidget, QWidget, QLabel)
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QSize, QPoint,Qt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter


class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.resize(800, 800)
        label = QLabel(self)
        label.setText('<div>&#xe202;</div>')

        font_id = QFontDatabase.addApplicationFont(url)
        if font_id == -1:
            print('not fond')



        font = QFont("my-font",18)



        label.setStyleSheet('''font-size: 80pt; font-family: my-font;''')



if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

您可以尝试font-weight 属性,值 100-900 具有不同的粗细。 QFont.setWeight() 有一个等效的方法。

class Template(QWidget):

    def __init__(self):
        super().__init__()
        grid = QGridLayout(self)
        grid.addWidget(QLabel('Hello World'), 0, 0, Qt.AlignHCenter)
        for i in range(1, 10):
            lbl = QLabel(f'(i * 100) Hello World')
            lbl.setStyleSheet(f'font-weight: i * 100')
            grid.addWidget(lbl, i, 0)
        self.setStyleSheet('''
        QLabel 
            font-size: 24pt;
            font-family: Helvetica Neue;
        ''')

看起来像这样:

虽然这不适用于所有字体。您也可以继承 QLabel 并重新实现 paintEvent 以在窗口颜色中绘制文本轮廓。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class ThinLabel(QLabel):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def paintEvent(self, event):
        qp = QPainter(self)
        qp.setRenderHint(QPainter.Antialiasing)
        path = QPainterPath()
        path.addText(event.rect().bottomLeft(), self.font(), self.text())
        qp.setPen(QPen(self.palette().color(QPalette.Window), 2))
        qp.setBrush(self.palette().text())
        qp.drawPath(path)


class Template(QWidget):

    def __init__(self):
        super().__init__()
        grid = QGridLayout(self)
        grid.addWidget(QLabel('Hello World'), 0, 0)
        grid.addWidget(ThinLabel('Hello World'), 1, 0)
        self.setStyleSheet('''
        QLabel 
            font-size: 80pt;
            font-family: Helvetica Neue;
        ''')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Template()
    gui.show()
    sys.exit(app.exec_())

【讨论】:

第二个例子不适用于我的字体。 中的字体无法转换为字母&lt;div&gt;&amp;#xe202;&lt;/div&gt; @askqest 那颗星实际上有 html 实体 &amp;#10032; 如果你将它转换为 unicode 十六进制表示 setText('\u2730') 它应该可以工作。 我知道星号是 unicode。我只是为了清楚起见。我需要  从 my-font 转换为符号。

以上是关于如何更改文本的笔画粗细?的主要内容,如果未能解决你的问题,请参考以下文章

防止在更改字体粗细时移动文本[重复]

在 D3 强制布局链接标记上缩放箭头

Qt:更改字体粗细

Grafana如何更改注释线粗细

如何更改 <hr> 标签的粗细

如何在鼠标悬停时更改边框粗细