Qt之打印机功能

概述:

本人在项目中需要打印一些项目文件(以图片的形式)工期两天,首先聊聊实现思路,作为一个技术屌丝的我(再加上之前没弄过这块),第一先找到Qt帮助手册对QPrinter一顿查,查完,又找度娘查看看可不可以用纯C++实现,经过以上折腾给自己的结论是如果使用Qt一天编码一天调试会很轻松的交付任务(此处见证大家平时汇报工期一定要给自己留有余地,万一因为不认真出现bug就麻烦了),但是不一定满足部门大佬的初心,如果使用纯C++实现两天会把自己搞的很痛苦,所以做了一个全面了解后去找技术经理碰下,避免走歪路,经过沟通和项目周期情况最后我们选定使用Qt实现打印功能,等软件升级第二版本使用纯C++实现,接下来把我两天的工作以及遇到的问题都在代码中向大家体现;

代码示例:

.h:

#pragma once
#include <QPrinter>
#include <QPixmap>
#include <QPainter>
#include <QPrintPreviewDialog>
#include <QPrintDialog>
#include <QPageSetupDialog>

class CPrinter : public QObject
{
	Q_OBJECT
public:
	CPrinter();
	~CPrinter();

public://打印窗口
	/*
	 *  @brief:打印窗口
	 */
	void startPrinter(QPixmap &pixmap);

public://打印页面设置

	/*
	 *  @brief:页面设置
	 */
	void startPrinterPage();

public://打印预览
	/*
	 *  @brief:开启打印预览
	 */
	void startPrintPreview(QPixmap &pixmap);
private:
	/*
	 *  @brief:设置预览内容
	 */
	void setPrintPixmap(QPixmap &pixmap);
	/*
	 *  @brief:获取打印内容
	 */
	QPixmap getPrintPixmap();
	/*
	 *  @brief:开启打印预览窗口
	 */
	void PrintPreview();

private slots:

	void Slot_Preview(QPrinter* printer);

private:
	QPixmap m_Pixmap;		//界面控件内像素
	QPrinter *m_pPrinter;	//打印机
};


.cpp:

#include "CPrinter.h"

CPrinter::CPrinter() :m_pPrinter(NULL)
{
	if(m_pPrinter == NULL)
		m_pPrinter = new QPrinter;
}

CPrinter::~CPrinter()
{
	if (m_pPrinter != nullptr)
		delete m_pPrinter;
	m_pPrinter = NULL;
}

void CPrinter::startPrinter(QPixmap &pixmap)
{
	QPrinter printer(QPrinter::ScreenResolution);
	QPrintDialog printDialog(&printer);
	if (printDialog.exec() == QDialog::Accepted) {
		QPainter painterPixmap;
		painterPixmap.begin(&printer);
		painterPixmap.drawPixmap(0, 0, pixmap);
		painterPixmap.end();
	}
}

void CPrinter::startPrinterPage()
{
	QPrinter printer;
	QPageSetupDialog pageSetUpdlg(&printer);
	if (pageSetUpdlg.exec() == QDialog::Accepted)
	{
		printer.setOrientation(QPrinter::Landscape);
	}
	else
	{
		printer.setOrientation(QPrinter::Portrait);
	}
}

void CPrinter::startPrintPreview(QPixmap &pixmap)
{
	if (pixmap.isNull())
		return;
	setPrintPixmap(pixmap);
	PrintPreview();
}

void CPrinter::setPrintPixmap(QPixmap &pixmap)
{
	m_Pixmap = pixmap;
}

QPixmap CPrinter::getPrintPixmap()
{
	return m_Pixmap;
}

void CPrinter::PrintPreview()
{
	QPrinter printer;
	QPrintPreviewDialog previewDialog(&printer);
	connect(&previewDialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(Slot_Preview(QPrinter*)));
	previewDialog.exec(); //打印预览对话框显示,paintRequest触发
}

void CPrinter::Slot_Preview(QPrinter* printer)
{
	QPainter painterPixmap;
	painterPixmap.begin(printer);
	//QRect rect = painterPixmap.viewport();
	//int x = rect.width() / getPrintPixmap().width();
	//int y = rect.height() / getPrintPixmap().height();
	//painterPixmap.scale(x, y);
	painterPixmap.drawPixmap(0, 0, getPrintPixmap());
	painterPixmap.end();
}

调用:

	if (str.compare(QString::fromLocal8Bit("打印")) == 0)
	{
		QPixmap pixmap = QPixmap::grabWidget(Widget, Widget->rect());
		m_Printer->startPrinter(pixmap);
	}
	else if (str.compare(QString::fromLocal8Bit("页面设置")) == 0)
	{
		m_Printer->startPrinterPage();

	else if (str.compare(QString::fromLocal8Bit("打印预览")) == 0)
	{
		QPixmap pixmap = QPixmap::grabWidget(Widget, Widget->rect());
		m_Printer->startPrintPreview(pixmap);
	}

运行效果图:

1.打印
在这里插入图片描述

2.打印预览
在这里插入图片描述
3.页面设置
在这里插入图片描述

over:

欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法或有问题可以在文末评论一起讨论!
共同学习!
共同进步!

文末一句话:

什么是随和?
有人说,随和就是顺从众议,不固执己见;有人说,随和就是不斤斤计较,为人和蔼。
还有人说,随和其实就是傻,就是老好人,就是没有原则。
那么,随和到底是什么?随和不是自卑,不是唯唯诺诺,而是有原则、有标准,用淡定的态度做事。
随和的人,朋友多、人缘好。一天两天的随和不是真随和,长久如一的好性情才是真正的随和。

  • 12
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
在Linux Qt中,可以通过以下步骤来调用激光打印机: 1. 安装激光打印机驱动程序。通常情况下,Linux操作系统会自带一些通用的激光打印机驱动程序。如果你使用的是特定品牌的激光打印机,你需要安装该品牌的驱动程序。 2. 配置打印机。在Linux系统中,你需要使用CUPS来配置打印机。你可以通过打开浏览器并输入http://localhost:631/来访问CUPS管理页面。在管理页面中,你可以添加、删除、编辑打印机以及进行其他设置。 3. 在Qt中编写代码。Qt提供了QPrinter类来实现打印功能。你需要创建一个QPrinter对象,并设置相关的参数,包括打印机名称、纸张大小、打印质量等。然后,你可以使用QPainter类来绘制需要打印的内容,最后调用QPrinter的print()函数来实现打印。 下面是一个简单的示例代码: ```cpp QPrinter printer(QPrinter::HighResolution); printer.setPrinterName("MyPrinter"); printer.setPageSize(QPrinter::A4); printer.setOrientation(QPrinter::Portrait); QPainter painter(&printer); painter.drawText(100, 100, "Hello, World!"); if (!printer.isValid()) { qDebug() << "打印机不存在或不可用。"; } else { if (!painter.end()) { qDebug() << "绘制错误。"; } else { if (!printer.startDoc()) { qDebug() << "无法开始打印。"; } else { if (!printer.newPage()) { qDebug() << "无法开始新页。"; } else { if (!printer.endDoc()) { qDebug() << "无法结束打印。"; } else { qDebug() << "打印完成。"; } } } } } ``` 在这个示例中,我们创建了一个名为"MyPrinter"的打印机,并将纸张大小设置为A4,方向设置为纵向。然后,我们使用QPainter绘制了一个简单的文本。最后,我们通过调用QPrinter的函数来实现打印功能。在打印过程中,我们也需要进行一些错误处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值