最近遇到一个打印相关的问题,就是如何通过代码设定打印的相关信息,然后一键打印出来呢,不通过系统的打印设置界面(下图所示)进行设置内容,直接实现打印?
网上找到的一般的打印都如下所示,都是通过了QPrintDialog进行弹出系统打印设置,然后再进行打印,才完成打印,类似如下代码:
void printImageEx()
{
QPrinter printer;
QPrintDialog dialog(&printer, this);
dialog.setOption(QPrintDialog::PrintSelection, true);
// 设置页边距,例如设置上下左右边距均为0厘米
QMarginsF margins(0, 0, 0, 0);
QPageLayout pageLayout(QPageSize(QPageSize::A4), QPageLayout::Landscape, margins);
printer.setPageLayout(pageLayout); // 应用新的页面布局,包含边距设置
if (dialog.exec() == QDialog::Accepted) // 这里就是最烦人的弹出打印窗口
{
QPainter pain;
if (!pain.begin(&printer))
{
qDebug() << tr("选择取消打印");
QMessageBox::warning(this, "NecRec", tr("选择取消打印"));
return;
}
QRect printRect = pain.viewport(); // 打印机纸张的大小 像素单位
double dPrintDpiX, dPrintDpiY;
dPrintDpiX = printer.physicalDpiX() / 25.4; // 打印机的一毫米对应的像素 X方向
dPrintDpiY = printer.physicalDpiY() / 25.4; // Y 方向
//设置字体信息
QFont font;
font = pain.font();
font.setPointSize(10); // 设置字体大小
pain.setFont(font);
pain.setPen(Qt::black); // 设置文本颜色
// 替换成为自己需要打印的内容
pain.drawLine(0, 0, printRect.width(), printRect.height()); // 绘制斜线
pain.drawText(printRect.width() / 2, printRect.height() / 2, tr("中间绘制文本内容")); // m_pain.drawText(textX2, textY2, evt.strEvtName);
pain.end(); // 结束打印
}
}
那么如何通过直接指定打印相关设置,跳过QPrintDialog弹出,直接实现打印呢,当然是可以的,主要就是通过QPrinterInfo获取打印机相关的配置,设置打印机相关的参数到QPrinter中,直接实现打印,代码如下:
void printImage()
{
QString defalutPrint; // 打印机名称
// 纸张信息
QPageSize pageSize = QPageSize(QPageSize::A4); // 设置纸张类型
QMargins margins(1,1,1,1); // 单位毫米 边距
QPrinterInfo printInfo;
defalutPrint = printInfo.defaultPrinterName(); // 设置打印机(自行修改为自己需要用到的打印机名称即可)
QPrinter printer;
printer.setPrinterName(defalutPrint);
if (!printer.setPageSize(pageSize))
{
QMessageBox::warning(this, tr("打印失败"), tr("设置纸张类型异常!"));
qDebug() << tr("设置纸张类型异常");
return;
}
if (!printer.setPageOrientation(QPageLayout::Orientation::Landscape))
{
QMessageBox::warning(this, tr("打印失败"), tr("设置纸张打印方向异常!"));
qDebug() << tr("设置纸张打印方向异常");
return;
}
printer.setPrintRange(QPrinter::CurrentPage); // 打印当前页 可选设置为打印打印当前页或者页码范围,或者全部打印
QPainter pain;
if (!pain.begin(&printer))
{
qDebug() << tr("选择取消打印");
QMessageBox::warning(this, "NecRec", tr("选择取消打印"));
return;
}
QRect printRect = pain.viewport(); // 打印机纸张的大小 像素单位
double dPrintDpiX, dPrintDpiY;
dPrintDpiX = printer.physicalDpiX() / 25.4; // 打印机的一毫米对应的像素 X方向
dPrintDpiY = printer.physicalDpiY() / 25.4; // Y 方向
//设置字体信息
QFont font;
font = pain.font();
font.setPointSize(10); // 设置字体大小
pain.setFont(font);
pain.setPen(Qt::black); // 设置文本颜色
// 替换成为自己需要打印的内容
pain.drawLine(0, 0, printRect.width(), printRect.height()); // 绘制斜线
pain.drawText(printRect.width()/ 2, printRect.height()/2, tr("中间绘制文本内容")); // m_pain.drawText(textX2, textY2, evt.strEvtName);
pain.end(); // 结束打印
}