Qt实现保存、浏览、预览、打印功能
Qt提供了以⽂本、图⽚、HTML等⽅式来实现对⽂档的操作,主要⽤到了QPrinter类和QPainter类,⽤到了QFileDialog⽂件窗⼝、QPrintPreviewDialog预览窗⼝类和QPrintDialog打印窗⼝类,Qt5也提供了QPdfWriter类来实现对pdf的操作,这⾥并不包括打开pdf⽂件,Qt没有提供任何⽅法来直接像⽂件浏览器⼀样打开pdf⽂件,可以⽤第三⽅库来实现。
这⾥采⽤了图⽚的⽅式来实现保存、预览和打印,其实 三个功能基本上⼀样。
pretty women
1、保存PDF
(1)保存某个控件⾥的内容
⼀些输⼊类控件可以直接调⽤print()函数,⼀些显⽰类的控件可以直接调⽤render()函数,⼀些控件不具备这个功能。代码如下:
void MainWindow::on_btnSave_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF⽂件"), QString(), "*.pdf");
if (!fileName.isEmpty())
{trirock
tilt
// 如果⽂件后缀为空,则默认使⽤.pdf
if (QFileInfo(fileName).suffix().isEmpty())
{
fileName.append(".pdf");
}
QPrinter printer;
// 指定输出格式为pdf
printer.tOutputFormat(QPrinter::PdfFormat);
printer.tOutputFileName(fileName);
/
/ ui->textEdit->print(&printer);
ui->tableWidget->render(&printer);
}
}
(2)保存某些控件⾥的内容
这⾥需要将要保存的所有内容放在⼀个容器⾥⾯,⽐如放在QWidget上,同样可以⽤上⾯的⽅式来保存,下⾯⽤的是以图⽚的⽅式来保存。代码如下:
QString fileName = QFileDialog::getSaveFileName(this, tr("保存PDF⽂件"), QString(), "*.pdf");
if (!fileName.isEmpty())
{
// 如果⽂件后缀为空,则默认使⽤.pdf
if (QFileInfo(fileName).suffix().isEmpty())
{
fileName.append(".pdf");issue
}
QPrinter printerPixmap(QPrinter::HighResolution);
//⾃定义纸张⼤⼩,这⾥要打印的内容都在stackedWidget上
printerPixmap.tPageSize(QPrinter::Custom);
printerPixmap.tPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()), QPrinter::Point);
//设置纸张⼤⼩为A4,这⾥注释掉了,建议⾃定义纸张,否则保存的就会有很多空⽩
//printerPixmap.tPageSize(QPrinter::A4);
脚踏实地英文//横向打印
printerPixmap.tOrientation(QPrinter::Landscape);
//设置输出格式为pdf
printerPixmap.tOutputFormat(QPrinter::PdfFormat);
//设置输出路径
printerPixmap.tOutputFileName(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);
QMessageBox::information(this, tr("⽣成PDF"), tr("保存PDF⽂件成功"), QMessageBox::Ok);
}
}
2、浏览
Qt没有提供浏览pdf的⽅式,可以通过使⽤第三⽅库Poppler来实现,这⾥是相关⽂件:,,,。可以通过官⽅的源码来编译库,不过可能会⾮常坎坷。我试了这个⽅法,不过没有成功,(⊙﹏⊙)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\\",bbc
QStringList() << fileName);
3、预览
预览使⽤了预览对话框QPrintPreviewDialog,也是⽤的图⽚的⽅式来预览pdf,其实预览窗⼝已经⾃带了打印按钮,在这个界⾯已经可以打印了。代码如下:
QPrinter printer(QPrinter::HighResolution);
/
/⾃定义纸张⼤⼩
printer.tPageSize(QPrinter::Custom);
printer.tPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()),
QPrinter::Point);
QPrintPreviewDialog preview(&printer, this);
preview.tMinimumSize(1000,600);
connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreviewSlot(QPrinter*)));
< ();
}
void MainWindow::printPreviewSlot(QPrinter *printerPixmap)
{
printerPixmap->tOrientation(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();
lawless
painterPixmap.scale(x, y);
painterPixmap.drawPixmap(0, 0, pixmap);
}
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 (() == QDialog::Accepted)
{
ui->textEdit->print(&printer);
}
}
QPrinter printerPixmap;
QPixmap pixmap = QPixmap::grabWidget(ui->stackedWidget, ui->stackedWidget->rect()); //获取界⾯的图⽚
QPrintDialog print(&printerPixmap, this);
if (())
{
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);
}
}