如何打印具有文本和图形的QGraphicsScene

时间:2010-09-09 19:20:29

标签: qt printing qt4 qt4.6

我有一个QGraphicsScene,上面有图形和文字。当我尝试打印时,图形很好,但是文本使用的是以点为单位定义的字体大小,因此当我传递scene->render() QPainter初始化为QPrinter时大文。

我应该如何打印包含文字的QGraphicsScene

编辑:

以下是我当前的打印代码,scene_QGraphicsScene的自定义子类:

  QPrinter printer(QPrinter::HighResolution);
  QPrintDialog dialog(&printer, this);
  dialog.exec();
  std::cout << printer.resolution() << std::endl;
  QPainter painter(&printer);
  scene_->render(&painter);

std:cout行似乎没有任何区别。打印机仍然认为文本很大,因此对于每个文本项目,只打印第一个字母的一小部分。

2 个答案:

答案 0 :(得分:3)

QPrinter docs来看,您必须指定字体大小(以像素为单位)才能使文字和图形匹配。请注意,QFontsetPixelSize方法。

答案 1 :(得分:1)

设置QPrinter:

默认情况下,QPrinter对象初始化为屏幕分辨率(通常为96 DPI),除非您在构造函数中指定QPrinter::HighResolution,然后使用正在使用的打印机的分辨率。

如果您使用QPrinter设置QPrintDialog对象,则代码应如下所示:

QPrinter printer(QPrinter::HighResolution);
QPrintDialog dialog(&printer, this);
dialog.exec();
std::cout << printer.resolution() << std::endl;

此后,程序应输出所选打印机的DPI。在我的情况下,它打印出600。

如果您没有使用QPrintDialog,则应使用上面显示的QPrinter构造函数,然后使用打印机的已知DPI调用setResolution(DPI)

这会导致字体呈现正确。

<强>更新

现在周末来了,我终于有时间正确考虑这个问题了:) 虽然在技术上正确设置QPrinter,但上述解决方案对于包含点大小指定的文本的图形场景不实用。由于所有图形项都是以像素坐标指定的,因此只有以像素为单位指定字体大小才有意义,以确保在与其他图形基元混合时字体与预期完全一致。

不需要担心不同显示器上文本的大小,因为图形项本身不是分辨率独立的。视图可以指定缩放转换以处理不同的分辨率和DPI监视器。

打印时,默认情况下,QPrinter会缩放以使整个场景适合页面。这是有道理的,因为600 DPI打印机上的100 x 100正方形在您的纸张上宽度为1/6英寸宽度:)