diff options
-rw-r--r-- | src/printsupport/kernel/qprinter.cpp | 171 | ||||
-rw-r--r-- | src/printsupport/kernel/qprinter_p.h | 28 | ||||
-rw-r--r-- | tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp | 15 |
3 files changed, 128 insertions, 86 deletions
diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp index 819f9343f7..0c08e44617 100644 --- a/src/printsupport/kernel/qprinter.cpp +++ b/src/printsupport/kernel/qprinter.cpp @@ -48,7 +48,6 @@ #include <qpa/qplatformprintersupport.h> #include "qprintengine.h" -#include "qprinterinfo.h" #include "qlist.h" #include <qcoreapplication.h> #include <qfileinfo.h> @@ -163,10 +162,39 @@ Q_PRINTSUPPORT_EXPORT QSizeF qt_printerPaperSize(QPrinter::Orientation orientati (qt_paperSizes[paperSize][height_index] * 72 / 25.4) / multiplier); } -void QPrinterPrivate::createDefaultEngines() +QPrinterInfo QPrinterPrivate::findValidPrinter(const QPrinterInfo &printer) { - QPlatformPrinterSupport *ps = QPlatformPrinterSupportPlugin::get(); - if (outputFormat == QPrinter::NativeFormat && ps) { + // Try find a valid printer to use, either the one given, the default or the first available + QPrinterInfo printerToUse = printer; + if (printerToUse.isNull()) { + printerToUse = QPrinterInfo::defaultPrinter(); + if (printerToUse.isNull()) { + QList<QPrinterInfo> availablePrinters = QPrinterInfo::availablePrinters(); + if (!availablePrinters.isEmpty()) + printerToUse = availablePrinters.at(0); + } + } + return printerToUse; +} + +void QPrinterPrivate::initEngines(QPrinter::OutputFormat format, const QPrinterInfo &printer) +{ + // Default to PdfFormat + outputFormat = QPrinter::PdfFormat; + QPlatformPrinterSupport *ps = 0; + QString printerName; + + // Only set NativeFormat if we have a valid plugin and printer to use + if (format == QPrinter::NativeFormat) { + ps = QPlatformPrinterSupportPlugin::get(); + QPrinterInfo printerToUse = findValidPrinter(printer); + if (ps && !printerToUse.isNull()) { + outputFormat = QPrinter::NativeFormat; + printerName = printerToUse.printerName(); + } + } + + if (outputFormat == QPrinter::NativeFormat) { printEngine = ps->createNativePrintEngine(printerMode); paintEngine = ps->createPaintEngine(printEngine, printerMode); } else { @@ -174,8 +202,42 @@ void QPrinterPrivate::createDefaultEngines() paintEngine = pdfEngine; printEngine = pdfEngine; } + use_default_engine = true; had_default_engines = true; + printEngine->setProperty(QPrintEngine::PPK_PrinterName, printerName); + addToManualSetList(QPrintEngine::PPK_PrinterName); + validPrinter = true; +} + +void QPrinterPrivate::changeEngines(QPrinter::OutputFormat format, const QPrinterInfo &printer) +{ + QPrintEngine *oldPrintEngine = printEngine; + const bool def_engine = use_default_engine; + + initEngines(format, printer); + + if (oldPrintEngine) { + for (int i = 0; i < manualSetList.size(); ++i) { + QPrintEngine::PrintEnginePropertyKey key = manualSetList[i]; + QVariant prop; + // PPK_NumberOfCopies need special treatmeant since it in most cases + // will return 1, disregarding the actual value that was set + // PPK_PrinterName also needs special treatment as initEngines has set it already + if (key == QPrintEngine::PPK_NumberOfCopies) + prop = QVariant(q_ptr->copyCount()); + else if (key != QPrintEngine::PPK_PrinterName) + prop = oldPrintEngine->property(key); + + if (prop.isValid()) { + printEngine->setProperty(key, prop); + addToManualSetList(key); + } + } + } + + if (def_engine) + delete oldPrintEngine; } #ifndef QT_NO_PRINTPREVIEWWIDGET @@ -510,13 +572,7 @@ QPrinter::QPrinter(PrinterMode mode) : QPagedPaintDevice(), d_ptr(new QPrinterPrivate(this)) { - d_ptr->init(mode); - QPrinterInfo defPrn(QPrinterInfo::defaultPrinter()); - if (!defPrn.isNull()) { - setPrinterName(defPrn.printerName()); - } else if (QPrinterInfo::availablePrinters().isEmpty()) { - setOutputFormat(QPrinter::PdfFormat); - } + d_ptr->init(QPrinterInfo(), mode); } /*! @@ -528,11 +584,10 @@ QPrinter::QPrinter(const QPrinterInfo& printer, PrinterMode mode) : QPagedPaintDevice(), d_ptr(new QPrinterPrivate(this)) { - d_ptr->init(mode); - setPrinterName(printer.printerName()); + d_ptr->init(printer, mode); } -void QPrinterPrivate::init(QPrinter::PrinterMode mode) +void QPrinterPrivate::init(const QPrinterInfo &printer, QPrinter::PrinterMode mode) { if (!QCoreApplication::instance()) { qFatal("QPrinter: Must construct a QCoreApplication before a QPrinter"); @@ -540,14 +595,8 @@ void QPrinterPrivate::init(QPrinter::PrinterMode mode) } printerMode = mode; - outputFormat = QPrinter::NativeFormat; - createDefaultEngines(); -#ifndef QT_NO_PRINTPREVIEWWIDGET - previewEngine = 0; -#endif - realPrintEngine = 0; - realPaintEngine = 0; + initEngines(QPrinter::NativeFormat, printer); } /*! @@ -612,40 +661,30 @@ QPrinter::~QPrinter() \since 4.1 Sets the output format for this printer to \a format. + + If \a format is the same value as currently set then no change will be made. + + If \a format is NativeFormat then the printerName will be set to the default + printer. If there are no valid printers configured then no change will be made. + If you want to set NativeFormat with a specific printerName then use + setPrinterName(). + + \sa setPrinterName() */ void QPrinter::setOutputFormat(OutputFormat format) { Q_D(QPrinter); - if (d->validPrinter && d->outputFormat == format) - return; - d->outputFormat = format; - - QPrintEngine *oldPrintEngine = d->printEngine; - const bool def_engine = d->use_default_engine; - d->printEngine = 0; - d->createDefaultEngines(); + if (d->outputFormat == format) + return; - if (oldPrintEngine) { - for (int i = 0; i < d->manualSetList.size(); ++i) { - QPrintEngine::PrintEnginePropertyKey key = d->manualSetList[i]; - QVariant prop; - // PPK_NumberOfCopies need special treatmeant since it in most cases - // will return 1, disregarding the actual value that was set - if (key == QPrintEngine::PPK_NumberOfCopies) - prop = QVariant(copyCount()); - else - prop = oldPrintEngine->property(key); - if (prop.isValid()) - d->printEngine->setProperty(key, prop); - } + if (format == QPrinter::NativeFormat) { + QPrinterInfo printerToUse = d->findValidPrinter(); + if (!printerToUse.isNull()) + d->changeEngines(format, printerToUse); + } else { + d->changeEngines(format, QPrinterInfo()); } - - if (def_engine) - delete oldPrintEngine; - - if (d->outputFormat == QPrinter::PdfFormat) - d->validPrinter = true; } /*! @@ -683,30 +722,38 @@ QString QPrinter::printerName() const /*! Sets the printer name to \a name. - \sa printerName(), isValid() + If the \a name is empty then the output format will be set to PdfFormat. + + If the \a name is not a valid printer then no change will be made. + + If the \a name is a valid printer then the output format will be set to NativeFormat. + + \sa printerName(), isValid(), setOutputFormat() */ void QPrinter::setPrinterName(const QString &name) { Q_D(QPrinter); ABORT_IF_ACTIVE("QPrinter::setPrinterName"); - QList<QPrinterInfo> prnList = QPrinterInfo::availablePrinters(); + if (printerName() == name) + return; + if (name.isEmpty()) { - d->validPrinter = d->outputFormat == QPrinter::PdfFormat; - } else { - d->validPrinter = false; - for (int i = 0; i < prnList.size(); ++i) { - if (prnList[i].printerName() == name) { - d->validPrinter = true; - break; - } - } + setOutputFormat(QPrinter::PdfFormat); + return; } - d->printEngine->setProperty(QPrintEngine::PPK_PrinterName, name); - d->addToManualSetList(QPrintEngine::PPK_PrinterName); -} + QPrinterInfo printerToUse = QPrinterInfo::printerInfo(name); + if (printerToUse.isNull()) + return; + if (outputFormat() == QPrinter::PdfFormat) { + d->changeEngines(QPrinter::NativeFormat, printerToUse); + } else { + d->printEngine->setProperty(QPrintEngine::PPK_PrinterName, name); + d->addToManualSetList(QPrintEngine::PPK_PrinterName); + } +} /*! \since 4.4 diff --git a/src/printsupport/kernel/qprinter_p.h b/src/printsupport/kernel/qprinter_p.h index 2bec44aae6..7e5bc12cd0 100644 --- a/src/printsupport/kernel/qprinter_p.h +++ b/src/printsupport/kernel/qprinter_p.h @@ -59,6 +59,7 @@ #ifndef QT_NO_PRINTER #include "QtPrintSupport/qprinter.h" +#include "QtPrintSupport/qprinterinfo.h" #include "QtPrintSupport/qprintengine.h" #include "QtCore/qpointer.h" @@ -75,14 +76,19 @@ class Q_PRINTSUPPORT_EXPORT QPrinterPrivate Q_DECLARE_PUBLIC(QPrinter) public: QPrinterPrivate(QPrinter *printer) - : printEngine(0) - , paintEngine(0) - , q_ptr(printer) - , printRange(QPrinter::AllPages) - , use_default_engine(true) - , validPrinter(false) - , hasCustomPageMargins(false) - , hasUserSetPageSize(false) + : printEngine(0), + paintEngine(0), + realPrintEngine(0), + realPaintEngine(0), +#ifndef QT_NO_PRINTPREVIEWWIDGET + previewEngine(0), +#endif + q_ptr(printer), + printRange(QPrinter::AllPages), + use_default_engine(true), + validPrinter(false), + hasCustomPageMargins(false), + hasUserSetPageSize(false) { } @@ -90,9 +96,11 @@ public: } - void init(QPrinter::PrinterMode mode); + void init(const QPrinterInfo &printer, QPrinter::PrinterMode mode); - void createDefaultEngines(); + QPrinterInfo findValidPrinter(const QPrinterInfo &printer = QPrinterInfo()); + void initEngines(QPrinter::OutputFormat format, const QPrinterInfo &printer); + void changeEngines(QPrinter::OutputFormat format, const QPrinterInfo &printer); #ifndef QT_NO_PRINTPREVIEWWIDGET QList<const QPicture *> previewPages() const; void setPreviewMode(bool); diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp index 644cd33e5c..b8b4c00549 100644 --- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp +++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp @@ -207,9 +207,6 @@ void tst_QPrinter::getSetCheck() QCOMPARE(obj1.printerSelectionOption(), QString::fromLatin1("--option")); #endif - obj1.setPrinterName(QString::fromLatin1("myPrinter")); - QCOMPARE(obj1.printerName(), QString::fromLatin1("myPrinter")); - // bool QPrinter::fontEmbeddingEnabled() // void QPrinter::setFontEmbeddingEnabled(bool) obj1.setFontEmbeddingEnabled(false); @@ -461,7 +458,7 @@ void tst_QPrinter::testNonExistentPrinter() QPainter painter; // Make sure it doesn't crash on setting or getting properties - printer.setPrinterName("some non existing printer"); + printer.printEngine()->setProperty(QPrintEngine::PPK_PrinterName, "some non existing printer"); printer.setPageSize(QPrinter::A4); printer.setOrientation(QPrinter::Portrait); printer.setFullPage(true); @@ -709,9 +706,6 @@ void tst_QPrinter::valuePreservation() printer.setCollateCopies(!status); printer.setOutputFormat(newFormat); -#ifdef Q_OS_MAC - QEXPECT_FAIL("","QTBUG-26430", Abort); -#endif QCOMPARE(printer.collateCopies(), !status); printer.setOutputFormat(oldFormat); QCOMPARE(printer.collateCopies(), !status); @@ -909,13 +903,6 @@ void tst_QPrinter::valuePreservation() printer.setOutputFormat(newFormat); printer.setOutputFormat(oldFormat); QCOMPARE(printer.printerName(), status); - - status = QString::fromLatin1("SuperDuperPrinter"); - printer.setPrinterName(status); - printer.setOutputFormat(newFormat); - QCOMPARE(printer.printerName(), status); - printer.setOutputFormat(oldFormat); - QCOMPARE(printer.printerName(), status); } // QPrinter::printerSelectionOption is explicitly documented not to be available on Windows. #ifndef Q_OS_WIN |