我已经创建了一个QTextDocument
,其中有一个表。现在我试图将其渲染成PDF格式使用QPdfWriter
(Qt 5.2.1)。我是这样做的:
QPdfWriter pdfWriter(output);
QPainter painter(&pdfWriter);
doc->drawContents(&painter);
它可以工作,但问题是PDF格式的表格非常非常小。我该怎么做才能扩大规模呢?我的意思是放大整个文档,而不仅仅是这个表,因为我计划在文档中添加更多的内容。
使用当前Qt(>= 5.3),您只需要调用:QPdfWriter::setResolution(int dpi)
您可以使用QPdfWriter::setPageSizeMM()
或QPdfWriter::setPageSize()
设置页面大小。为了测试这个想法,您可以在代码中添加pdfWriter.setPageSize(QPagedPaintDevice::A0);
。
答案是使用QPainter::scale()
,所以在我的情况下:
QPdfWriter pdfWriter(output);
QPainter painter(&pdfWriter);
painter.scale(20.0, 20.0);
doc->drawContents(&painter);
这使得画家把所有的东西都画大20倍。
我仍然不知道为什么QPdfWriter
把所有的东西都画得这么小,但是问题可以按照上面的方法解决。
我刚刚也被这个抓住了。当我调用QPdfWriter
的widthMM()
和width()
函数时,我弄清楚了发生了什么。宽度mm大约是200,这对于A4/Letter页面来说是合适的(一个合理的默认值),但是width
返回大约为9600。我打电话给logicalDpiX()
,结果是1200。
所以这表明QPdfWriter
的逻辑单位是"点",默认情况下每英寸有1200个点。因此,你需要在自己的逻辑单元和"点"之间进行缩放。例如,如果你的逻辑单元是一个Point,那么你需要这样做:
QPdfWriter writer(filename);
int logicalDPIX=writer.logicalDpiX();
const int PointsPerInch=72;
QPainter painter;
painter.begin(&writer)
QTransform t;
float scaling=(float)logicalDPIX/PointsPerInch; // 16.6
t.scale(scaling,scaling);
// do drawing with painter
painter.end()
painter.setTransform(t);