gpt4 book ai didi

qt - 在执行之间持久化/序列化 QPrinter (QPrintDialog)

转载 作者:行者123 更新时间:2023-12-04 18:12:58 25 4
gpt4 key购买 nike

在 Qt Desktop 应用程序中,如何在应用程序运行之间保持 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 的函数,但它仅返回打印机名称。还有其他建议吗?

最佳答案

我编写了以下代码来读取 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;

关于qt - 在执行之间持久化/序列化 QPrinter (QPrintDialog),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com