我正在尝试创建一个带有文本轮廓的标签。我只想要一个简单的带黑色轮廓的白色文本。我第一次尝试在css中这样做label.setStyleSheet("color:white; outline:2px black;")
但大纲什么也没做
我做了很多搜索,找到了使用qpainter path的方法。但问题是文本总是被截断
根据函数,文本应该从左下角开始,但它开始得太低,太左。我知道我可以通过试错找到一个点,这样它就不会被切断-你可以-20到这个高度,这对这一个就足够了。但它只会修复这个特定的文本!对于任何具有不同大小、文本或字体的标签,它都不相同
我将把最小的代码示例放在这里
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QLabel, QMainWindow
class MainLabel(QLabel):
def __init__(self, text):
super(MainLabel, self).__init__(text)
def paintEvent(self, event):
qp = QtGui.QPainter()
qp.begin(self)
qp.setRenderHint(QtGui.QPainter.Antialiasing)
font=QtGui.QFont()
font.setPointSize(70)
painterPath = QtGui.QPainterPath()
#how to get the right positioning for addText
painterPath.addText(0, self.height(), font,self.text())#HERE
qp.strokePath(painterPath, QtGui.QPen(QtGui.QColor(0,0,0), 6))
qp.fillPath(painterPath, QtGui.QColor(255,255,255))
qp.end()
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.centralWidget=QWidget(self)
self.setCentralWidget(self.centralWidget)
self.lay = QtWidgets.QVBoxLayout()
self.centralWidget.setLayout(self.lay)
self.label = MainLabel("text gets cut off")
self.label.setStyleSheet("font-size:70pt;color:white; outline:2px black;")
self.lay.addWidget(self.label)
self.show()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())
这是一件很常见的事情,我在任何地方都能看到,但在PYQT中没有一个简单的函数可以解决这个问题,而不会引起更多的问题?因此,正常的Qlabel将自动处理定位,但如果您想要文本轮廓,就必须放弃它
所以我想问,如果这是获得文本轮廓的唯一方法,如何找到像普通Qlabel一样的正确定位,否则如果有其他更好的方法,请告诉我。
仅仅因为没有方便的函数或样式表属性并不意味着没有一致的解决方案
<> P>有许多属性要考虑来设置文本的基线位置:QLabor的几何结构、文本的边界、对齐、缩进、字体度量。概述的文本总体上要比相同点大小的常规文本大,因此sizeHint
和minimumSizeHint
被重新实现以解释它。这些文档解释了如何计算indent并将其与对齐一起使用。文本和字符的几何、上升、下降和方位都是从QFontMetrics获得的。利用此信息,可以确定模拟QLabel的QPainterPath.addText
的位置您可以使用
setBrush
和setPen
设置OutlinedLabel
填充和轮廓颜色。默认值为带黑色轮廓的白色文本。轮廓厚度基于字体的点大小,默认比率为1/25(即25磅字体的轮廓厚度为1倍)。使用setOutlineThickness
更改它。如果您想要不基于点大小的固定轮廓(例如3px),请调用setScaledOutlineMode(False)
和setOutlineThickness(3)
此类仅支持左/右/上/下/中心对齐的单行纯文本字符串。如果您想要其他QLabel功能,如超链接、换行、省略文本等,也需要实现这些功能。但在这些情况下,你可能不会使用文本大纲
下面是一个示例,说明它适用于各种标签:
现在Qt实际上处于关键地位,因为您可以通过所有QBrush/QPen选项从中获得比纯色文本和轮廓更多的内容:
注意,我选择使用
setBrush
/setPen
方法将OutlineLabel视为QGraphicsItem。如果要使用文本颜色的样式表,请使用qp.fillPath(path, self.palette().text())
填充路径另一种方法不是调用
QPainter.strokePath
然后再调用QPainter.fillPath
,而是使用QPainterPathStroker生成文本路径的可填充轮廓,但我注意到它比较慢。我只会使用它来调整非常小的文本的清晰度,方法是将笔划的宽度设置为大于笔的宽度。若要尝试,请将paintEvent
中的最后5行替换为:相关问题 更多 >
编程相关推荐