Qt实现保存、浏览、预览、打印功能的示例代码

Qt提供了以文本、图片、HTML等方式来实现对文档的操作,主要用到了QPrinter类和QPainter类,用到了QFileDialog文件窗口、QPrintPreviewDialog预览窗口类和QPrintDialog打印窗口类,Qt5也提供了QPdfWriter类来实现对pdf的操作,这里并不包括打开pdf文件,Qt没有提供任何方法来直接像文件浏览器一样打开pdf文件,可以用第三方库来实现。

这里采用了图片的方式来实现保存、预览和打印,其实 三个功能基本上一样。

1、保存PDF

(1)保存某个控件里的内容

一些输入类控件可以直接调用print()函数,一些显示类的控件可以直接调用render()函数,一些控件不具备这个功能。代码如下:

void MainWindow::on_btnSave_clicked()
{
 QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF文件"), QString(), "*.pdf");
 if (!fileName.isEmpty())
 {
 // 如果文件后缀为空,则默认使用.pdf
 if (QFileInfo(fileName).suffix().isEmpty())
 {
  fileName.append(".pdf");
 }
 QPrinter printer;
 // 指定输出格式为pdf
 printer.setOutputFormat(QPrinter::PdfFormat);
 printer.setOutputFileName(fileName);
 // ui->textEdit->print(&printer);
 ui->tableWidget->render(&printer);
 }
}

(2)保存某些控件里的内容

这里需要将要保存的所有内容放在一个容器里面,比如放在QWidget上,同样可以用上面的方式来保存,下面用的是以图片的方式来保存。代码如下:

void MainWindow::on_btnSave_clicked()
{
 QString fileName = QFileDialog::getSaveFileName(this, tr("保存PDF文件"), QString(), "*.pdf");
 if (!fileName.isEmpty())
 {
 // 如果文件后缀为空,则默认使用.pdf
 if (QFileInfo(fileName).suffix().isEmpty())
 {
  fileName.append(".pdf");
 }
 QPrinter printerPixmap(QPrinter::HighResolution);
 //自定义纸张大小,这里要打印的内容都在stackedWidget上
 printerPixmap.setPageSize(QPrinter::Custom);
 printerPixmap.setPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()), QPrinter::Point);
 //设置纸张大小为A4,这里注释掉了,建议自定义纸张 ,否则保存的就会有很多空白
 //printerPixmap.setPageSize(QPrinter::A4);
 //横向打印
 printerPixmap.setOrientation(QPrinter::Landscape);
 //设置输出格式为pdf
 printerPixmap.setOutputFormat(QPrinter::PdfFormat);
 //设置输出路径
 printerPixmap.setOutputFileName(fileName);
 //获取界面的图片
 QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect());
 QPainter painterPixmap;
 painterPixmap.begin(&printerPixmap);
 QRect rect = painterPixmap.viewport();
 int x = rect.width() / pixmap.width();
 int y = rect.height() / pixmap.height();
 //将图像(所有要画的东西)在pdf上按比例尺缩放
 painterPixmap.scale(x, y);
 //画图
 painterPixmap.drawPixmap(0, 0, pixmap);
 painterPixmap.end();
 QMessageBox::information(this, tr("生成PDF"), tr("保存PDF文件成功"), QMessageBox::Ok);
 }
}

2、浏览

Qt没有提供浏览pdf的方式,可以通过使用第三方库Poppler来实现,这里是相关文件:官网编译好的库文件所有文件的文件包,实现pdf阅读器。可以通过官方的源码来编译库,不过可能会非常坎坷。

我试了这个方法,不过没有成功,(⊙﹏⊙)b!因为只是需要实现打开pdf文件的一个小功能而不是实现类似pdf阅读器,所以就换了一个方法,回头搞阅读器的时候还是得研究一番。

这里用的是进程的方法来使用电脑上的阅读器打开文件,优点是:简单,就两行代码;缺点是:①电脑上没下载阅读器就没办法了;②效率应该没有使用第三方库高。

代码如下:

QString fileName = QFileDialog::getOpenFileName(this, tr("选择文件"),QString(),
       tr("PDF 文档 (*.pdf);;所有文件 (*.*)"));
 QProcess * p = new QProcess;
 p->start("C:\\Program Files (x86)\\Foxit Software\\Foxit Reader Plus\\FoxitReaderPlus.exe",
  QStringList() << fileName);

3、预览

预览使用了预览对话框QPrintPreviewDialog,也是用的图片的方式来预览pdf,其实预览窗口已经自带了打印按钮,在这个界面已经可以打印了。代码如下:

void MainWindow::on_btnPreview_clicked()
{
 QPrinter printer(QPrinter::HighResolution);
 //自定义纸张大小
 printer.setPageSize(QPrinter::Custom);
 printer.setPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()),
    QPrinter::Point);
 QPrintPreviewDialog preview(&printer, this);
 preview.setMinimumSize(1000,600);
 connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreviewSlot(QPrinter*)));
 preview.exec ();
}
void MainWindow::printPreviewSlot(QPrinter *printerPixmap)
{
 printerPixmap->setOrientation(QPrinter::Landscape);
 //获取界面的图片
 QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect());
 QPainter painterPixmap(this);
 painterPixmap.begin(printerPixmap);
 QRect rect = painterPixmap.viewport();
 int x = rect.width() / pixmap.width();
 int y = rect.height() / pixmap.height();
 painterPixmap.scale(x, y);
 painterPixmap.drawPixmap(0, 0, pixmap);
 painterPixmap.end();
}

4、打印

打印使用了打印对话框QPrintDialog,如何打印文本框内容的话直接用print()函数就行,否则还是用打印图片的方式,和预览不同的其实就是使用的窗口类不同其余都差不多,代码如下:

void MainWindow::on_btnPrint_clicked()
{
 // 创建打印机对象
 QPrinter printer;
 // 创建打印对话框
 QString printerName = printer.printerName();
 if( printerName.size() == 0)
 return;
 QPrintDialog dlg(&printer, this);
 //如果编辑器中有选中区域,则打印选中区域
 if (ui->textEdit->textCursor().hasSelection())
 dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
 // 如果在对话框中按下了打印按钮,则执行打印操作
 if (dlg.exec() == QDialog::Accepted)
 {
 ui->textEdit->print(&printer);
 }
}
void MainWindow::on_btnPrint_2_clicked()
{
 QPrinter printerPixmap;
 QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect()); //获取界面的图片
 QPrintDialog print(&printerPixmap, this);
 if (print.exec())
 {
 QPainter painterPixmap;
 painterPixmap.begin(&printerPixmap);
 QRect rect = painterPixmap.viewport();
 int x = rect.width() / pixmap.width();
 int y = rect.height() / pixmap.height();
 painterPixmap.scale(x, y);
 painterPixmap.drawPixmap(0, 0, pixmap);
 painterPixmap.end();
 }
}

以上这篇Qt实现保存、浏览、预览、打印功能的示例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JS实现全屏预览F11功能的示例代码

    老是不通过,没办法,只能是重新发布了,反正我就是杠上了,大大小小写过很多前端特效,当然也经常在网上copy或者修改人家的代码,我觉得也挺好的,为什么?!因为我想这样,你能怎么办,打我? 少废话,直接上代码, JS代码 function fullScreen(el) { var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullScreen,

  • Qt实现保存、浏览、预览、打印功能的示例代码

    Qt提供了以文本.图片.HTML等方式来实现对文档的操作,主要用到了QPrinter类和QPainter类,用到了QFileDialog文件窗口.QPrintPreviewDialog预览窗口类和QPrintDialog打印窗口类,Qt5也提供了QPdfWriter类来实现对pdf的操作,这里并不包括打开pdf文件,Qt没有提供任何方法来直接像文件浏览器一样打开pdf文件,可以用第三方库来实现. 这里采用了图片的方式来实现保存.预览和打印,其实 三个功能基本上一样. 1.保存PDF (1)保存某

  • vue实现在线预览office文件的示例代码

    最近在做电子档案,后端提供了文件的华为云的oss链接.已经实现了点击下载文件的功能.但是呢,他们又希望常规的文件,可以直接点击预览,不需要下载. 按道理说,做文件的在线预览,买个第三方服务什么的,后端部署一下服务,前端对接一下,就通通搞定. 顶不住第三方基本上是要money的.那不想掏money,还有什么解决方法呢. 方法一 用微软的office online进行在线预览 https://view.officeapps.live.com/op/view.aspx?src=文件地址 例:https

  • nodejs 图片预览和上传的示例代码

    本文介绍了nodejs 图片预览和上传的示例代码,分享给大家,具体如下: 效果如下: 前言 一般在上传图片之前需要暂存在本地预览一下. 前端图片预览用的是 FileReader的readAsDataURL方法 nodejs 图片上传用的是中间件 Multer 本地图片预览 FileReader对象允许web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用文件或Blob对象来指定要读取的文件或数据. readAsDataURL方法用于读取指定的Blob或文件的内容.当读取操

  • js实现浏览器打印功能的示例代码

    最近接触到一个新需求,实现打印机打印小票的功能.打的一桌子小票(惭愧),不过也基本满足了业务上的需求,现在分享一下如何实现(好记性不如烂笔头) 先上代码 // 布局代码 <div id="print">     <div id="print_content"></div> </div> //js 部分代码var f = document.getElementById('printf'); if (f) { docume

  • Android实现PDF预览打印功能

    最近在做一个项目,需要用到android手机连接打印机进行打印的功能,目前在网上找到的教程介绍的都是蓝牙连接热敏打印机(pos机大小的打印机)和蓝牙打印机,如果连接日常所见到的网络打印机,进行打印,很显然这些教程是做不到的. 由于android没有提供任何标准,都是自家封的API,参考了WPS的APP的打印功能,决定按照WPS的方案来写,需要安装打印服务插件,比如PrinterShare以及三星.HP提供的自家打印服务插件. 一.连接打印管理者 当程序需要直接管理打印进程时,在收到用户的打印请求

  • Vue 页面监听用户预览时间功能的实现代码

    最近的业务中涉及到这样一个需求,在线培训的系统需要知道用户对某个在线预览的页面追踪用户的预览时长.初步我们首先想到借助 Vue 页面的生命周期函数 mounted 和 destroyed,分别在其中加入开始计时和清除计时的逻辑,通过后台的接口上报对应的培训素材的时间数据,即可达到目的. 有了思路,我们就可以开始筹划具体的代码. 定义开始结束计时函数 在 data 中定义我们通过变量定义计时器,这样可以通过 this.timer 随处可访问,便于后面销毁页面的时候清除它. duration 为时长

  • Android快速实现无预览拍照功能

    本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下 实现思路: 把预览的SurfaceView的宽高设置为肉眼看不出的值,例如0.1dp,其他的就是自定义相机的标准步骤了! 当然,网上自定义相机的文章多的去了,我是不可能再做老生常谈的事的,在这里我推荐一个很好用的第三方库,也许很多人已经了解过并且用过,没用过的同学可以试试,亲测好用. 废话不多说,先上源码地址 这里简单介绍一下用法: 1.在gradle里添加库的依赖:compile 'com.wonderk

  • JS实现上传图片的三种方法并实现预览图片功能

    在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览. 常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面:另一种思路是,直接在本地内存中预览图片,用户确认提交后再上传至服务器保存. 这两种方法各有利弊,方法一很明显,浪费流量和服务器资源:方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高(在某些低版本中的IE浏览器不支持). 以下是实现上述思路的方法: 1. 模板文件 <!DOCTYPE html> <html l

  • java使用PDFRenderer实现预览PDF功能

    本文实例为大家分享了java使用PDFRenderer实现预览PDF功能,供大家参考,具体内容如下 需要一个jar PDFRenderer-0.9.0.jar package com.wonders.stpt.attach.action; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInp

随机推荐