如何显示拉伸字体(double width/height)?
How to display stretched font (double width/height)?
我想在屏幕上展示热敏打印机的打印效果。
打印机有特殊的格式,可以打印双倍高度或双倍宽度的字体,所以我搜索了一些东西,但 Html 和 Rich Text 似乎都没有这样做的选项。
我也查看了 QTextBlock
,但找不到像拉伸或宽度比例适当的东西。
逐像素绘制字体是唯一的方法吗?
该问题将两个问题混为一谈:
如何绘制拉长的字体?很简单:更改 QPainter
的水平或垂直缩放比例。 Qt 将为您完成剩下的工作。例如:
QPainter p;
p.setTransform(QTransform(2.0, 0, 0, 1.0, 0, 0)));
p.drawText(0, 0, "STRETCHED");
如何在富文本中表示拉伸?如果不修改 Qt 源代码,那是不可能直接实现的——尽管这样的修改会非常简单。否则,您可以将文本预渲染为图像,并使用图像代替文本。
除了 Kuba Obre 的建议,我还发现 QFont
的方法 setStretch()
完全符合我的需要。
然后有两种方法可以使用拉伸的QFont来渲染一段文档:
创建富文本文档 (QTextDocument
)。我没有尝试,但过程似乎如下(创建一个新的 RTF 比加载整个文本然后编辑所需的文本片段更容易)。
QTextCursor::setCharFormat(const QTextCharFormat & format)
,直接使用QTextCharFormat::setFontStretch(int factor)
(无需通过QFont)。然后QTextCursor::insertText(const QString & text)
.
使用 QPainter
和拉伸字体。 QPainter::setFont(const QFont & font)
然后 QPainter::drawText()
第二种方法速度更快,但需要与坐标作斗争。第一种方法较长,但呈现方式类似于文本文档。
我会评估哪个更适合我。
希望对其他人有用,a.
这是一个使用 QTextDocument 的工作示例(富文本格式创建)
让我们在 ui 中添加一个名为 browser
的 QTextBrowser 小部件
QFont font; //we can optionally .setFamily()
QTextDocument * rtf = new QTextDocument(this);
//QTextCursor is needed to write into the TextDocument (otherwise it is readonly)
QTextCursor * editor = new QTextCursor(rtf);
QTextCharFormat format = QTextCharFormat();
editor->insertText("Normal Text\n");
//prepare font for wide text
font.setStretch(200);
format.setFont(font);
editor->setCharFormat(format);
editor->insertText("WIDE text\n");
//prepare font for narrow text
font.setStretch(50);
format.setFont(font);
editor->setCharFormat(format);
editor->insertText("narrow text\n");
ui->browser->setDocument(rtf);
我想在屏幕上展示热敏打印机的打印效果。
打印机有特殊的格式,可以打印双倍高度或双倍宽度的字体,所以我搜索了一些东西,但 Html 和 Rich Text 似乎都没有这样做的选项。
我也查看了 QTextBlock
,但找不到像拉伸或宽度比例适当的东西。
逐像素绘制字体是唯一的方法吗?
该问题将两个问题混为一谈:
如何绘制拉长的字体?很简单:更改
QPainter
的水平或垂直缩放比例。 Qt 将为您完成剩下的工作。例如:QPainter p; p.setTransform(QTransform(2.0, 0, 0, 1.0, 0, 0))); p.drawText(0, 0, "STRETCHED");
如何在富文本中表示拉伸?如果不修改 Qt 源代码,那是不可能直接实现的——尽管这样的修改会非常简单。否则,您可以将文本预渲染为图像,并使用图像代替文本。
除了 Kuba Obre 的建议,我还发现 QFont
的方法 setStretch()
完全符合我的需要。
然后有两种方法可以使用拉伸的QFont来渲染一段文档:
创建富文本文档 (
QTextDocument
)。我没有尝试,但过程似乎如下(创建一个新的 RTF 比加载整个文本然后编辑所需的文本片段更容易)。
QTextCursor::setCharFormat(const QTextCharFormat & format)
,直接使用QTextCharFormat::setFontStretch(int factor)
(无需通过QFont)。然后QTextCursor::insertText(const QString & text)
.使用
QPainter
和拉伸字体。QPainter::setFont(const QFont & font)
然后QPainter::drawText()
第二种方法速度更快,但需要与坐标作斗争。第一种方法较长,但呈现方式类似于文本文档。 我会评估哪个更适合我。
希望对其他人有用,a.
这是一个使用 QTextDocument 的工作示例(富文本格式创建)
让我们在 ui 中添加一个名为 browser
QFont font; //we can optionally .setFamily()
QTextDocument * rtf = new QTextDocument(this);
//QTextCursor is needed to write into the TextDocument (otherwise it is readonly)
QTextCursor * editor = new QTextCursor(rtf);
QTextCharFormat format = QTextCharFormat();
editor->insertText("Normal Text\n");
//prepare font for wide text
font.setStretch(200);
format.setFont(font);
editor->setCharFormat(format);
editor->insertText("WIDE text\n");
//prepare font for narrow text
font.setStretch(50);
format.setFont(font);
editor->setCharFormat(format);
editor->insertText("narrow text\n");
ui->browser->setDocument(rtf);