2017-05-04 231 views
2

我發現了以下代碼片段,它的工作原理與我的期望相同,但問題在於,當打開PDF文件並且用戶從PDF閱讀器打印PDF文件與其他打印機並不關閉時PDF閱讀器並從我的應用程序再次打印PDF文件,它將使用PDF閱讀器上配置的打印機進行打印,而不是將打印機設置爲打印PDF文件。從Qt打印PDF文件

例子:

  1. 應用我設置Printer_1以打印PDF文件。
  2. 打印文件(它將打開PDF閱讀器中的文件並使用Printer_1打印機進行打印)。
  3. 在PDF閱讀器上,我點擊CTRL + P進行打印,然後選擇Printer_2並單擊打印。
  4. 我沒有關閉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; 
} 

回答

0

我很抱歉,但我會說,這似乎是合理的是預期的行爲:如果應用程序已經打開,它被設計成不打開單獨的實例相同的文件(如許多觀衆做和你一樣),那麼很可能目前的設置(在你的情況下,當前的打印機)也被保留下來,因爲基本上什麼都沒有改變。如果您重現您的步驟,但通過您自己手動打開PDF文件來替換您的程序,我相當確信您會看到相同的結果。

一個選項是避免打開外部查看器並直接加載PDF文件(目前使用第三方庫,如Poppler)並使用Qt的模塊打印。你可以檢查this answer瞭解更多關於它的信息。

0

,而不是線

QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\print\\command", QSettings::NativeFormat).value("Default").toString(); 

利用這一點,並預期所有作品:

QString printPath = QSettings(classesRoot + "\\" + pdfId + "\\shell\\printto\\command", QSettings::NativeFormat).value("Default").toString(); 

又通 「文件名」, 「打印機名稱」, 「打印機驅動程序」 和 「端口」[驅動程序名稱和端口不是強制性的]