gpt4 book ai didi

c++ - QPrinter 分辨率在 Linux 中是错误的

转载 作者:IT王子 更新时间:2023-10-29 01:26:39 27 4
gpt4 key购买 nike

我正在尝试让一些图像打印程序在 Qt 中运行。尝试打印到具有 ppd 的自定义打印机。根据设备信息进行计算,以创建要发送到打印机的图像。

查看打印机属性时,我看到分辨率300 dpi x 300 dpi

在 windows 中,一切正常 - 但在 Linux 中,计算的图像信息变得非常大,使我的文件爆炸......查看所有数据我发现在 Linux 中,physicalDpiXphysicalDpiY(用于代码计算)是1200而不是300。

所以我把它归咎于 QPrinter::PrinterMode

QPrinter::HighResolution 2 On Windows, sets the printer resolution to that defined for the printer in use. For PostScript printing, sets the resolution of the PostScript driver to 1200 dpi.

我更改了我的构造函数来处理它 - 以防默认值错误......它没有工作:

Printer::Printer(const QPrinterInfo& printerInfo, MainWindow* pWnd) :
#if defined(Q_OS_WIN32) || defined (Q_MAC_OSX)
QPrinter(QPrinter::HighResolution)
#else
QPrinter(QPrinter::ScreenResolution)
#endif
{
qDebug()<<"printer resolution physicalDpiX="<< this->physicalDpiX()<<", physicalDpiY="<<this->physicalDpiY();
// prints 1200 for each in Linux, 300 in windows
qDebug()<<"printer resolution="<< this->resolution();
// prints 96 in Linux, 300 in windows
// printer properties (like from system-config-printer) show 300
// printerInfo.printerName() and printerInfo.defaultPrinter().printerName() show my printer
}

这些数字在 Linux 中的分辨率是错误的,但在 Windows 中是正确的

尝试过

这->setResolution(300);

它使 this.resolution() 变为 300,但 physicalDpiX 和 Y 仍然显示 1200。

QPrinter::supportedResolutions ()好像说这个案子没救了……

如何让我的打印机看到打印机属性中显示的分辨率?

从 cups 中提取一些方法是唯一的希望吗?我试过了...我不明白如何使用我找到的唯一一条信息:cups Resolution

最佳答案

首先,永远不要依赖物理设备分辨率。用户可以使用不同分辨率的打印机,以一种分辨率(300dpi)打印一次,下一次以其他分辨率(600dpi)打印,或者可以打印到 PDF 文件,或者打开使用屏幕分辨率的打印预览窗口。其次,仅将 ScreenResolution 用于打印到屏幕,对于任何高分辨率设备来说,它都太粗糙了。文字和图片会很丑,在页面上的定位精度会太低。

独立于物理设备分辨率和操作系统的打印也可以通过 QPainter 实现缩放。据我所知,QPainter 的基本分辨率是 1200dpi。这意味着这是 Qt 可以打印的最佳有效分辨率。下一个示例显示如何在页面上绘制任何内容之前设置缩放比例。

QPrinter printer(QPrinter::HighResolution);
qreal resolutionFactor = 1200 / printer->resolution();
QPainter painter;
painter.begin(&printer);
painter.scale(1 / resolutionFactor, 1 / resolutionFactor);
printPage(&painter); // This method should implement printing itself
painter.end();

然后为 1200dpi 的基本 QPainter 分辨率实现内容绘制(设置 x 和 y 坐标、图像的宽度和高度等),渲染过程将注意所有尺寸将自动缩放到目标设备的分辨率。

关于c++ - QPrinter 分辨率在 Linux 中是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26307733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com