2

I use a QPrintDialog to initialize a QPrinter object like this:

QPrinter printer;
QPrintDialog dlg(&printer);
if (dlg.exec() == QDialog::Accepted)
{
   /* Are we printing to PDF? */
}

On Windows, it's easy to detect if the output is going to a file or to a PDF writer. On a Mac, none of the same functions work:

if ((printer.outputFormat() == QPrinter::PdfFormat)
 || (!printer.outputFileName().isEmpty()))
{
    qDebug("PDF mode");
}

Looking at a copy of qprintdialog_mac.mm online, in the function QPrintDialogPrivate::closeCarbonPrintPanel(), Qt attempts to detect if the output is redirected to a file. It stores the file name in a member of QMacPrintEnginePrivate. Somehow that name never makes its way to the QPrinter object. I'm not sure where the disconnect is.

So..... how can I tell if the print output is actually going to a file? I'm willing to get platform specific here if it's easy. I have zero Mac programming experience though.

4

2 回答 2

0

这是 Qt 中的一个错误。

在 Qt 5.3 中,由于第二个条件调用QPrinter::outputFileName().

于 2014-06-15T04:07:28.953 回答
0

从 Qt 5.14 开始,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 对象中提取信息。

于 2020-06-17T10:34:11.013 回答