1.头文件
#pragma once
#ifndef __PRINTERMANAGER_H__
#define __PRINTERMANAGER_H__
#include <QObject>
#include <QString>
#include <QImage>
#include <QRect>
#include <QPrinter>
#include <QPainter>
#include <functional>
#include <QPixmap>
class PrinterManager : public QObject
{
Q_OBJECT
public:
//单例
static PrinterManager* instance();
//打印接口
Q_INVOKABLE bool printImage(const QImage& magePath,bool showDialog = true);
Q_INVOKABLE bool printPixmap(const QPixmap& pixmap,bool showDialog = true);
private:
explicit PrinterManager(QObject* parent = nullptr);
//操作函数
bool executePrint(std::function<void(QPainter&)> paintFunction,bool showDialog);
//计算rect(起始位置和长宽)
QRect calculateImageRect(const QImage& image,const QRect& pageRect);
private:
static PrinterManager* m_instance;
};
#endif
2.cpp文件
#include "Printer/printerManager.h"
#include <QPrintDialog>
#include <QDebug>
PrinterManager* PrinterManager::m_instance = nullptr;
PrinterManager* PrinterManager::instance()
{
if(!m_instance)
{
m_instance = new PrinterManager();
}
return m_instance;
}
PrinterManager::PrinterManager(QObject* parent) : QObject(parent)
{
qDebug()<<"打印机管理器初始化完成";
}
bool PrinterManager::printPixmap(const QPixmap& pixmap,bool showDialog)
{
if(pixmap.isNull())
{
qWarning()<<"pixmap为空";
return false;
}
QImage image = pixmap.toImage();
printImage(image,showDialog);
}
bool PrinterManager::printImage(const QImage& image,bool showDialog)
{
if(image.isNull())
{
qWarning()<<"待打印图片为空";
return false;
}
return executePrint([this,&image](QPainter& painter){
QRect pageRect = painter.viewport();
QRect targetRect = calculateImageRect(image,pageRect);
painter.drawImage(targetRect,image);
},showDialog);
}
bool PrinterManager::executePrint(std::function<void(QPainter&)> paintFunction,bool showDialog)
{
QPrinter printer;
if(showDialog)
{
QPrintDialog dialog(&printer);
if(dialog.exec() != QDialog::Accepted)
{
qDebug()<<"用户取消打印";
return false;
}
}
QPainter painter;
if(!painter.begin(&printer))
{
qWarning()<<"无法启动打印机绘图";
return false;
}
try
{
paintFunction(painter);
painter.end();
qDebug()<<"打印完成";
return true;
}
catch(const std::exception& e)
{
painter.end();
qCritical()<<"打印过程中发生错误";
return false;
}
}
QRect PrinterManager::calculateImageRect(const QImage& image,const QRect& pageRect)
{
QSize imageSize = image.size();
imageSize.scale(pageRect.size(),Qt::KeepAspectRatio);
int x = pageRect.x()+(pageRect.width() - imageSize.width())/2;
int y = pageRect.y()+(pageRect.height()-imageSize.height())/2;
return QRect(x,y,imageSize.width(),imageSize.height());
}