2017-05-04 3 views
2

Ich habe folgende Code-Schnipsel gefunden, die wie erwartet funktioniert, aber das Problem ist, dass, wenn eine PDF-Datei geöffnet ist und Benutzer die PDF-Datei mit einem anderen Drucker aus dem PDF-Reader drucken und nicht schließen Der PDF-Reader und erneut die PDF-Datei aus meiner Anwendung drucken, wird es mit Drucker, der auf PDF-Reader konfiguriert ist, nicht den Drucker drucken, den ich zum Drucken der PDF-Datei eingestellt habe.Drucken einer PDF-Datei aus Qt

Beispiel:

  1. Auf Antrag stelle ich Printer_1 als PDF-Datei zu drucken.
  2. Die Datei drucken (die Datei wird im PDF-Reader geöffnet und mit dem Drucker Printer_1 gedruckt).
  3. Auf PDF-Reader gehe ich zu CTRL + P zu drucken und dort wähle ich Printer_2 und klicken Sie auf Drucken.
  4. Ich schließe nicht den PDF-Reader und erneut auf Anwendung (Drucker ist zu Printer_1 ausgewählt), drucke ich die PDF-Datei. Jetzt wird der Druckbefehl an Printer_2 anstelle von Printer_1 gesendet.

Bitte, was ist das Problem in den folgenden Code-Snippet?

#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; 
} 

Antwort

0

Es tut mir leid, aber ich hatte gesagt, dass dies angemessen scheint das erwartete Verhalten zu sein: wenn die Anwendung bereits geöffnet ist, und es ist nicht darauf ausgelegt separate Instanzen für die gleiche Datei zu öffnen (wie viele Zuschauer tun und wie bei Ihnen), ist es sehr wahrscheinlich, dass die aktuellen Einstellungen (in Ihrem Fall der aktuelle Drucker) ebenfalls erhalten bleiben, da sich im Grunde nichts geändert hat. Wenn Sie Ihre Schritte reproduzieren, aber Ihr Programm durch Ihr eigenes manuelles Öffnen der PDF-Datei ersetzen, bin ich ziemlich zuversichtlich, dass Sie die gleichen Ergebnisse sehen werden.

Eine Option wäre, das Öffnen eines externen Viewers zu vermeiden und die PDF-Datei direkt zu laden (derzeit mit einer Drittanbieter-Bibliothek wie Poppler) und mit den Modulen von Qt zu drucken. Sie können überprüfen, this answer für weitere Informationen darüber.

0

statt Linie

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

Verwendung dieses und alle Arbeiten wie erwartet:

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

Und pass "Dateiname", "Druckername", "Druckertreiber" und "Port" [driver Name und Port sind nicht verpflichtend]

Verwandte Themen