我发现以下代码片段符合我的期望,但问题是,当PDF文件打开并且用户使用PDF阅读器中的其他打印机打印PDF文件而不关闭PDF阅读器并再次打印PDF文件时从我的应用程序,它将使用PDF阅读器上配置的打印机进行打印,而不是我设置为打印PDF文件的打印机 .
例:
-
在应用程序中,我将Printer_1设置为打印PDF文件 .
-
打印文件(它将在PDF阅读器中打开文件并使用Printer_1打印机进行打印) .
-
在PDF阅读器上,我转到
CTRL + P
进行打印,然后选择Printer_2并单击打印 . -
我没有关闭PDF阅读器并再次在应用程序上(打印机被选择到Printer_1),我打印PDF文件 . 现在打印命令被发送到Printer_2而不是Printer_1 .
请问以下代码段中的问题是什么?
#include <QSettings>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[])
{
const QString classesRoot = "HKEY_CLASSES_ROOT";
// get ID of .pdf extension
QSettings pdfSettings(classesRoot + "\\.pdf", QSettings::NativeFormat);
QString pdfId = pdfSettings.value("Default").toString();
// get path to default program that associated with PDF files
QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString();
QString openPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\open\\command", QSettings::NativeFormat).value("Default").toString();
qDebug() << "print path" << printPath;
qDebug() << "open path" << openPath;
// open .pdf file
QProcess::startDetached(openPath.arg("full path to pdf file.pdf") );
// print .pdf file
QProcess printProcess;
printProcess.start(printPath.arg("full path to pdf file.pdf") );
printProcess.waitForFinished(-1);
return 0;
}
2 回答
而不是线
使用此和所有工作按预期方式:
并传递“filename”,“打印机名称”,“打印机驱动程序”和“端口”[驱动程序名称和端口不是必需的]
我很抱歉,但我说这似乎是合理的预期行为:如果应用程序已经打开并且它的设计不是为同一个文件打开单独的实例(就像许多 Spectator 那样和你的一样),那么极有可能当前的设置(在你的情况下,当前的打印机)也被保留,因为基本上没有任何改变 . 如果您重现您的步骤,但通过手动打开PDF文件替换您的程序,我相信您会看到相同的结果 .
一个选项是避免打开外部查看器并直接加载PDF文件(当前使用第三方库,如Poppler)并使用Qt的模块打印它 . 您可以查看this answer以获取有关它的更多信息 .