我有一个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行似乎没有任何区别。打印机仍然认为文本很大,因此对于每个文本项目,只打印第一个字母的一小部分。
答案 0 :(得分:3)
从QPrinter
docs来看,您必须指定字体大小(以像素为单位)才能使文字和图形匹配。请注意,QFont
有setPixelSize
方法。
答案 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英寸宽度:)