我想在屏幕上代表热敏打印机的打印效果。
打印机有特殊的格式,可以打印双倍高度或双倍宽度的字体,所以我搜索了一些内容,但Html和Rich Text似乎都没有选项来执行此操作。
我也看了QTextBlock
但是找不到拉伸或宽度比例适当的东西。
只能逐像素地绘制字体吗?
答案 0 :(得分:2)
这个问题混淆了两个问题:
如何绘制拉伸字体?这很简单:更改QPainter
的水平或垂直缩放。 Qt将为您完成剩下的工作。 E.g:
QPainter p;
p.setTransform(QTransform(2.0, 0, 0, 1.0, 0, 0)));
p.drawText(0, 0, "STRETCHED");
如何用富文本表达拉伸?如果不修改Qt源,这是不可能直接实现的 - 虽然这种修改非常简单。否则,您可以将文本预渲染为图像,并使用图像而不是文本。
答案 1 :(得分:1)
除了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。
答案 2 :(得分:1)
这是使用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 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);