【发布时间】:2018-10-08 14:37:54
【问题描述】:
我正在尝试在 A4 上以毫米而不是默认设备单位打印发票文档。除了将单位更改为毫米时,打印文档上的文本点大小不再与 Word 或 Adobe Illustrator 中的点大小匹配。我尝试将点大小转换为相应的像素大小,但他们遇到了问题。
QFont::SetPixelSize 只接受一个 int,因此如果计算值低于 1,它将截断为 0
font.setPixelSize((9.0 * 72.0) / printer.resolution());
另一种方法使文本的垂直大小正确,但存在一些伪像:
int phys_w = printer.width();
font.setPointSizeF((9.0 / phys_w) * 210.0);
您可以在其中看到某些字符之间异常大的间隙。 (也许 Qt 的文本绘制代码内部存在一些精度问题?)
这是一个显示问题的最小示例:
QPrinter printer(QPrinter::HighResolution);
printer.setPageSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
printer.setFullPage(true);
printer.setPageMargins(QMarginsF(0, 0, 0, 0));
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("invoice.pdf");
QPainter painter(&printer);
auto page_size = printer.pageRect(QPrinter::Unit::Millimeter);
painter.setWindow(page_size.toRect());
QFont font = painter.font();
// Either this
font.setPixelSize((9.0 * 72.0) / printer.resolution());
// or this
int phys_w = printer.width();
font.setPointSizeF((9.0 / phys_w) * 210.0);
painter.setFont(font);
painter.drawText(35, 46, "John Doe");
如何以毫米(或任何任意单位)为单位进行定位,并使文本大小以点为单位正确(或某些正确的重新计算)?
这是在 Qt 5.10.0 和 Windows 10 上。
编辑 最后,我选择增加 10 倍的比例(即十分之一毫米),这解决了 setPointSizeF 可见的字距调整问题。现在我遇到的最后一个问题是设置线的宽度和其他形状(QPen::setWidth),我找不到计算,所以它以毫米为单位。
编辑 最后线宽不需要任何重新计算。最终代码如下:
QPrinter printer(QPrinter::HighResolution);
printer.setPageSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
printer.setFullPage(true);
printer.setPageMargins(QMarginsF(0, 0, 0, 0));
printer.setOutputFormat(QPrinter::NativeFormat);
QPainter painter(&printer);
painter.setWindow(0, 0, 2100, 2970);
painter.setViewport(0, 0, printer.width(), printer.height());
QFont font(fontFamily, 0, weight, italic);
font.setPointSizeF(static_cast<float>(pixelSize) / printer.width() * 2100);
【问题讨论】:
-
你能澄清一下 9.0 , 210.0, 72.0 值代表什么吗?
-
9.0 是以磅为单位的随机字体大小。 210 是 A4 纸的宽度,单位为毫米,72.0 是 DPI。