Qt QPainter以毫米而不是英寸为单位

Eej*_*jin 6 c++ printing qt transform

我有一个QPrinter可以直接打印A4到物理打印机或PDF.现在我想使用QPainter以毫米为单位绘制,但当前坐标系似乎是A4的宽度和高度,以英寸乘以打印机的分辨率.

8.26英寸×1200 res = 9912
11.69英寸×1200 res = 14028

我试过以下但是文字结果很大.

auto page = printer.pageRect(QPrinter::Unit::Millimeter);
painter.setWindow(QRect(0, 0, page.width(), page.height()));
Run Code Online (Sandbox Code Playgroud)

如何更改此设置,以便我的QPainter可以绘制到210 x 297 mm而不是上述系统?

这是在Windows 10和Qt 5.10上.

p-a*_*l-o 4

我在X11(ubuntu linux)PDF打印上测试了这个方法,使用ScreenResolution打印机模式:

painter.begin(printer);

int log_w  = 210;
int log_h  = 297;
painter.setWindow(0, 0, log_w, log_h);

int phys_w  = printer->width();
int phys_h = printer->height();
painter.setViewport(0, 0, phys_w, phys_h);
Run Code Online (Sandbox Code Playgroud)

基本上,使用画家窗口设置逻辑尺寸(以毫米为单位),并为画家的视口提供打印机的物理尺寸。此行应在页面周围打印一个边框为 10 毫米的矩形:

painter.drawRect(10, 10, log_w - 20, log_h -20);
Run Code Online (Sandbox Code Playgroud)

文本应该相应地起作用。此代码应在矩形的左上角打印“Ok”一词:

  QFont font = painter.font();
  font.setPointSize(10); //1 cm height
  painter.setFont(font);
  painter.drawText(10, 20, "Ok");

  painter.end();
Run Code Online (Sandbox Code Playgroud)

使用HighResolution打印机模式,字体大小必须使用设置

font.setPixelSize(10); //1 cm height
Run Code Online (Sandbox Code Playgroud)

并且QPen必须将 a 设置为画家:

QPen pen(Qt::black);
pen.setWidthF(0.2);
painter.setPen(pen);
painter.drawRect(10, 10, log_w - 20, log_h - 20);
Run Code Online (Sandbox Code Playgroud)

关于使用 失去设备依赖性setPixelSize,我知道这里有说明:

可以使用 setPixelSize() 将屏幕上显示的字符高度设置为指定的像素数;然而,使用 setPointSize() 具有类似的效果并提供设备独立性。

但我认为它仅指屏幕,因为这里有说明:

在 QPrinter 设备上渲染文本时,重要的是要认识到,以点为单位指定的文本大小与为设备本身指定的分辨率无关。因此,在将文本与图形组合时指定字体大小(以像素为单位)可能会很有用,以确保它们的相对大小符合您的预期。