2012-09-03 4 views
2

В приложении Qt Desktop, как я могу сохранить выбор QPrinter между запусками приложений?Сохранение/Сериализация QPrinter (QPrintDialog) между выполнением

Рассмотрим следующий код:

printDialog = new QPrintDialog(); 
if (printDialog->exec() == QDialog::Accepted) { 
    qDebug() << printDialog->printer(); // Gives just a pointer value, 
             // no real use for serializing. 
    view->print(printDialog->printer()); 
} 

Я хотел бы быть в состоянии сделать как:

printDialog = new QPrintDialog("some-previously stored settings") 

и, даже не вызывая QPrintDialog, просто печатать на предварительно выбранный принтер как что:

view->print(new QPrinter("some previously stored settings")) 

Существует функция, которая имеет дело с QPrinterInfo, но она просто возвращает принт ter name .. Любые другие предложения?

ответ

2

Я написал следующий код, чтобы читать и записывать все доступные настройки QPrinter в QDataStream. К сожалению, это не сохраняет/восстанавливает все Доступные параметры принтера (т. Е. В Windows). Но имя принтера, размер страницы и т. Д. Восстанавливается правильно.

Не стесняйтесь повторного использования.

/////////////////////////////////////////////////////////////////////////////// 
    // Write all available Attributes from QPrinter into stream 
    /////////////////////////////////////////////////////////////////////////////// 

    template <typename t> void writeStreamElement(QDataStream &os, t param) 
    { 
     int i = static_cast<int>(param); 
     os << i; 
    } 
    template <>   void writeStreamElement<QString>(QDataStream &os, QString s) 
    { 
     os << s; 
    } 

    QDataStream& operator<<(QDataStream &os, const QPrinter &printer) 
    { 
     writeStreamElement(os, printer.printerName  ()); 
     writeStreamElement(os, printer.pageSize   ()); 
     writeStreamElement(os, printer.collateCopies  ()); 
     writeStreamElement(os, printer.colorMode   ()); 
     writeStreamElement(os, printer.copyCount   ()); 
     writeStreamElement(os, printer.creator   ()); 
     writeStreamElement(os, printer.docName   ()); 
     writeStreamElement(os, printer.doubleSidedPrinting()); 
     writeStreamElement(os, printer.duplex    ()); 
     writeStreamElement(os, printer.fontEmbeddingEnabled()); 
     writeStreamElement(os, printer.fullPage   ()); 
     writeStreamElement(os, printer.orientation  ()); 
     writeStreamElement(os, printer.outputFileName  ()); 
     writeStreamElement(os, printer.outputFormat  ()); 
     writeStreamElement(os, printer.pageOrder   ()); 
     writeStreamElement(os, printer.paperSize   ()); 
     writeStreamElement(os, printer.paperSource  ()); 
     writeStreamElement(os, printer.printProgram  ()); 
     writeStreamElement(os, printer.printRange   ()); 
     writeStreamElement(os, printer.printerName  ()); 
     writeStreamElement(os, printer.resolution   ()); 
     writeStreamElement(os, printer.winPageSize  ()); 

     qreal left, top, right, bottom; 
     printer.getPageMargins(&left, &top, &right, &bottom, QPrinter::Millimeter); 
     os << left << top << right << bottom; 

     Q_ASSERT_X(os.status() == QDataStream::Ok, __FUNCTION__, QString("Stream status = %1").arg(os.status()).toStdString().c_str()); 
     return os; 
    } 
    /////////////////////////////////////////////////////////////////////////////// 
    // Read all available Attributes from tream into QPrinter 
    /////////////////////////////////////////////////////////////////////////////// 


    template <typename t> t readStreamElement(QDataStream &is) 
    { 
     int i; 
     is >> i; 
     return static_cast<t>(i); 
    } 
    template <> QString readStreamElement<QString>(QDataStream &is) 
    { 
     QString s; 
     is >> s; 
     return s; 
    } 

    QDataStream& operator>>(QDataStream &is, QPrinter &printer) 
    { 

     printer.setPrinterName    (readStreamElement<QString>    (is)); 
     printer.setPageSize     (readStreamElement<QPrinter::PaperSize> (is)); 
     printer.setCollateCopies   (readStreamElement<bool>     (is)); 
     printer.setColorMode    (readStreamElement<QPrinter::ColorMode> (is)); 
     printer.setCopyCount    (readStreamElement<int>     (is)); 
     printer.setCreator     (readStreamElement<QString>    (is)); 
     printer.setDocName     (readStreamElement<QString>    (is)); 
     printer.setDoubleSidedPrinting  (readStreamElement<bool>     (is)); 
     printer.setDuplex     (readStreamElement<QPrinter::DuplexMode> (is)); 
     printer.setFontEmbeddingEnabled  (readStreamElement<bool>     (is)); 
     printer.setFullPage     (readStreamElement<bool>     (is)); 
     printer.setOrientation    (readStreamElement<QPrinter::Orientation> (is)); 
     printer.setOutputFileName   (readStreamElement<QString>    (is)); 
     printer.setOutputFormat    (readStreamElement<QPrinter::OutputFormat> (is)); 
     printer.setPageOrder    (readStreamElement<QPrinter::PageOrder> (is)); 
     printer.setPaperSize    (readStreamElement<QPrinter::PaperSize> (is)); 
     printer.setPaperSource    (readStreamElement<QPrinter::PaperSource> (is)); 
     printer.setPrintProgram    (readStreamElement<QString>    (is)); 
     printer.setPrintRange    (readStreamElement<QPrinter::PrintRange> (is)); 
     printer.setPrinterName    (readStreamElement<QString>    (is)); 
     printer.setResolution    (readStreamElement<int>     (is)); 
     printer.setWinPageSize    (readStreamElement<int>     (is)); 

     qreal left, top, right, bottom; 
     is >> left >> top >> right >> bottom; 

     printer.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); 

     Q_ASSERT_X(is.status() == QDataStream::Ok, __FUNCTION__, QString("Stream status = %1").arg(is.status()).toStdString().c_str()); 

     return is; 
    } 


    /////////////////////////////////////////////////////////////////////////////// 
    // persist settings 
    /////////////////////////////////////////////////////////////////////////////// 
    QPrinter *sgPrinter =...; 
... 
    QByteArray byteArr; 
    QDataStream os(&byteArr, QIODevice::WriteOnly); 
    os << *sgPrinter; 
    QSettings settings("justMe", "myApp")); 
    settings.setValue("printerSetup", byteArr.toHex()); 

    /////////////////////////////////////////////////////////////////////////////// 
    // restore settings 
    /////////////////////////////////////////////////////////////////////////////// 
    QByteArray printSetUp = settings.value("printerSetup").toByteArray(); 
    printSetUp = QByteArray::fromHex(printSetUp); 
    QDataStream is(&printSetUp, QIODevice::ReadOnly); 
    is >> *sgPrinter; 
1

Вы остались в холоде от Qt. Функция, о которой вы просите, недоступна. Близкие по теме Qt пожелания (соблюдать возраст и приоритет запросов):

QPrinter: add << and >> operators so that the settings can be saved and loaded

QPrinter should provide a way to store/restore the settings

В текущей версии Qt, вы должны сохранять/загружать соответствующие значения QPrintDialog и QPrinter в QSettings (или такой, сериализуемый в файл) manually. Угадываясь от последнего полезного комментария в обоих упомянутых QTBUG, в Qt 5.0 нет улучшения.

+0

Большое спасибо. Я думаю, вернемся к чертежной доске, установив это вручную :(Я позволю ей варить на несколько дней и, вероятно, согласиться с этим объяснением в качестве ответа. – qdot