C++ 检测Mac上的PDF打印

C++ 检测Mac上的PDF打印,c++,macos,qt,pdf,C++,Macos,Qt,Pdf,我使用QPrintDialog初始化QPrinter对象,如下所示: QPrinter printer; QPrintDialog dlg(&printer); if (dlg.exec() == QDialog::Accepted) { /* Are we printing to PDF? */ } 在Windows上,很容易检测输出是要发送到文件还是PDF编写器。在Mac上,没有相同的功能可以工作: if ((printer.outputFormat() == QPrinte

我使用QPrintDialog初始化QPrinter对象,如下所示:

QPrinter printer;
QPrintDialog dlg(&printer);
if (dlg.exec() == QDialog::Accepted)
{
   /* Are we printing to PDF? */
}
在Windows上,很容易检测输出是要发送到文件还是PDF编写器。在Mac上,没有相同的功能可以工作:

if ((printer.outputFormat() == QPrinter::PdfFormat)
 || (!printer.outputFileName().isEmpty()))
{
    qDebug("PDF mode");
}
在线查看qprintdialog_mac.mm的副本,在函数QPrintDialogPrivate::closeCarbonPrintPanel()中,Qt尝试检测输出是否重定向到文件。它将文件名存储在QMacPrintEnginePrivate的成员中。不知何故,该名称从未到达QPrinter对象。我不确定断线在哪里

所以。。。。。我如何判断打印输出是否真的进入文件?如果容易的话,我愿意在这里了解特定平台。不过我没有Mac编程经验。

这是Qt中的一个bug


在Qt5.3中,由于第二个条件,即从Qt5.14起调用
QPrinter::outputFileName()

,QPrinter的outputFileName属性仍然为空,即使在QPrintDialog中选择了“另存为PDF”

但是,在绘制QPrinter对象时,正确的做法是

  • 如果选择“使用预览打开”,则将打开绘制的内容 在预览中
  • 如果选择“另存为PDF”,将弹出一个文件对话框
  • 如果选择“发送邮件”,邮件客户端将打开PDF文件 攻击
  • 等等
不知何故,QPrinter似乎以不透明的方式存储对话框中的所有信息,而公共getter无法访问这些信息

支持mac打印对话框中所有选项的正确方法似乎是:

QPrinter printer;
QPrintDialog dlg(&printer);
if (dlg.exec() == QDialog::Accepted)
{
   QPainter painter;
   painter.begin(&printer);
   // do the painting
   painter.end();
}

不幸的是,如果您想实现自己的打印逻辑,似乎无法从QPrinter对象中提取信息。

为什么要这样做?它应该是透明的。用户应该可以自由打印他/她想要的任何内容。我们可能会根据输出设备进行不同的渲染。也就是说,pdf可以放大得更详细。这已被报告为QTBUG-2091。