2

Qtデスクトップアプリケーションで、アプリケーションの実行間でQPrinterの選択を保持するにはどうすればよいですか?

次のコードを検討してください。

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を処理する関数がありますが、それは単にプリンター名を返すだけです。他に何か提案はありますか?

4

2 に答える 2

2

あなたはQtによって寒さの中で取り残されました。あなたが求めている機能は利用できません。関連するQt機能リクエスト(リクエストの経過時間と優先度を確認してください):

QPrinter:設定を保存およびロードできるように<<および>>演算子を追加します

QPrinterは、設定を保存/復元する方法を提供する必要があります

現在のQtバージョンでは、関連するQPrintDialogとQPrinterの値を手動でQSettings(またはファイルにシリアル化可能)に保存/ロードする必要があります。言及された両方のQTBUGの最後の有益なコメントから推測すると、Qt5.0では改善はありません。

于 2012-09-04T12:23:07.607 に答える
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;
于 2013-02-20T12:04:25.687 に答える