如何显示拉伸字体(双倍宽度/高度)



我想在屏幕上展示热敏打印机的打印效果。

打印机有特殊的格式,可以打印双倍高度或双倍宽度的字体,所以我搜索了一些内容,但Html和Rich Text似乎都没有这样做的选项。我也看了QTextBlock,但找不到像拉伸或宽度比合适的东西。

逐个像素绘制字体是唯一的方法吗?

这个问题合并了两个问题:

  1. 如何绘制拉伸字体?很简单:更改QPainter的水平或垂直缩放。Qt会帮你做剩下的。例如:

    QPainter p;
    p.setTransform(QTransform(2.0, 0, 0, 1.0, 0, 0)));
    p.drawText(0, 0, "STRETCHED");
    
  2. 如何在富文本中表达拉伸?如果不修改Qt来源,这是不可能直接实现的——尽管这样的修改非常简单。否则,可以将文本预渲染为图像,并使用图像而不是文本。

除了Kuba Obre的建议,我还发现QFont的方法setStretch()正是我所需要的。

然后有两种方法可以使用拉伸的QFont来呈现一段文档:

  1. 创建富文本文档(QTextDocument)。我没有尝试,但过程似乎如下(创建一个新的RTF比加载整个文本然后编辑所需的文本片段更容易)
    QTextCursor::setCharFormat(const QTextCharFormat & format),直接使用QTextCharFormat::setFontStretch(int factor)(无需通过QFont)。然后是CCD_ 8。

  2. 使用扩展字体的QPainterQPainter::setFont(const QFont & font)然后QPainter::drawText()

第二种方法速度更快,但需要与坐标作斗争。第一种方法较长,但呈现方式类似于文本文档。我会评估哪一个对我更好。

希望它对其他人有用。

这是一个使用QTextDocument(富文本格式创建)的工作示例

让我们在ui中有一个QTextBrowser小部件,名为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 Textn");
//prepare font for wide text
font.setStretch(200);
format.setFont(font);
editor->setCharFormat(format);
editor->insertText("WIDE textn");
//prepare font for narrow text
font.setStretch(50);
format.setFont(font);
editor->setCharFormat(format);
editor->insertText("narrow textn");
ui->browser->setDocument(rtf);

相关内容

  • 没有找到相关文章

最新更新