在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的函数,但它只返回打印机名称..还有其他建议吗?
答案 0 :(得分:2)
你被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没有任何改进。
答案 1 :(得分: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;