Linux中的QPrinter分辨率错误
QPrinter resolution is wrong in Linux
我正在尝试让一些图像打印程序在Qt中工作。正在尝试打印到具有ppd的自定义打印机。有基于设备信息的计算,以创建要发送到打印机的图像。
查看打印机属性时,我发现Resolution
就是300 dpi x 300 dpi
。
在windows中,一切都很好,但在Linux中,计算的图像信息变得非常大,使我的文件爆炸。。。通过查看所有数据,我发现在Linux中,physicalDpiX
和physicalDpiY
(用于代码计算)是1200,而不是300。
所以我把它归咎于QPrinter::PrinterMode
Q打印机::HighResolution 2在Windows上,将打印机分辨率设置为为使用中的打印机定义的。对于PostScript打印,设置PostScript驱动程序的分辨率为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 中是正确的
尝试
this->setResolution(300);
它使这个.resolution()变成了300,但physicalDpiX和Y仍然显示1200。
Q打印机::supportedResolutions()似乎说这个案子没有希望了。。。
如何使我的打印机显示"打印机"属性中显示的分辨率?
唯一的希望是从杯子里提取一些方法吗?我试过了。。。我不知道如何使用我发现的唯一一条信息: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坐标、图像的宽度和高度等),渲染过程将注意所有尺寸将自动缩放到目标设备的分辨率。
尽管我很想得到这个问题的通用答案,但目前我解决了用户预期使用的特定驱动程序的问题,同时将默认值(1200)留给其他驱动程序,如pdf或hp打印。。。
我的自定义打印机包含杯子选项,一个看起来像的分辨率选项
name="printer-resolution" value="300x300dpi"
我可以从中提取分辨率。如果不存在特定的cups选项,那么我可以使用默认的1200。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- QScreen geometry()api为分辨率2736 x 1824和2560 x 1600提供了错误的值
- C 模板功能过载分辨率错误
- 这是 gcc 过载分辨率中的错误吗?
- Linux中的QPrinter分辨率错误
- 可变模板分辨率在VS2013 -错误C3520