2012-09-03 1 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를 다루는 함수가 있지만 단순히 prin을 반환합니다. 다른 이름은?

답변

2

QDataStream에 사용 가능한 QPrinter의 모든 설정을 읽고 쓰는 다음 코드를 작성했습니다. 아쉽게도이 방법으로는 저장/복원하지 않습니다. 모두 프린터 옵션 (예 : 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

현재 Qt는 버전으로 QPrinter should provide a way to store/restore the settings

, 당신은/QSettings에로드 관련 QPrintDialog 및 QPrinter 값을 저장해야합니다 (또는 파일에 직렬화 가능) manually. 앞에서 언급 한 QTBUG에서 마지막으로 도움이 된 의견을 추측 할 때 Qt 5.0은 개선되지 않았습니다.

+0

고마워요. 수동으로 설정하여 드로잉 보드로 돌아가는 것 같아요. (. 며칠 더 끓일 것입니다. 아마도이 설명을 대답으로 받아 들일 것입니다. – qdot