在Mac上检测PDF打印

时间:2013-10-18 18:48:58

标签: 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() == QPrinter::PdfFormat)
 || (!printer.outputFileName().isEmpty()))
{
    qDebug("PDF mode");
}

在线查看qprintdialog_mac.mm的副本,在函数QPrintDialogPrivate :: closeCarbonPrintPanel()中,Qt尝试检测输出是否重定向到文件。它将文件名存储在QMacPrintEnginePrivate的成员中。不知怎的,这个名字永远不会进入QPrinter对象。我不确定断开连接的位置。

那么.....我怎么知道打印输出是否真的要进入文件?如果这很容易的话,我愿意在这里找到特定的平台。我虽然没有Mac编程经验。

2 个答案:

答案 0 :(得分:0)

这是Qt中的一个错误。

在Qt 5.3中,提供的示例代码将起作用,因为第二个条件是对QPrinter::outputFileName()的调用。

答案 1 :(得分:0)

从Qt 5.14开始,即使在QPrintDialog中选择了“另存为PDF”,QPrinter的outputFileName属性仍然为空。

但是,当绘制到QPrinter对象时,正确的事情完成了。

  • 如果选择“使用预览打开”,则绘制的内容将打开 在预览中。
  • 如果选择“另存为PDF”,则会弹出一个文件对话框
  • 如果选择“发送邮件”,则邮件客户端将打开PDF 附上

以某种方式,QPrinter似乎以一种不透明的方式存储了对话框中的所有信息,而公共获取者无法访问该信息。

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

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

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