QT QPrinter无弹窗后台打印

最近遇到一个打印相关的问题,就是如何通过代码设定打印的相关信息,然后一键打印出来呢,不通过系统的打印设置界面(下图所示)进行设置内容,直接实现打印?
系统打印设置界面
网上找到的一般的打印都如下所示,都是通过了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();  // 结束打印
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员吴同学

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值