雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊:

Qt提供了以文本、圖片、HTML等方式來(lái)實(shí)現(xiàn)對(duì)文檔的操作,主要用到了QPrinter類和QPainter類,用到了QFileDialog文件窗口、QPrintPreviewDialog預(yù)覽窗口類和QPrintDialog打印窗口類,Qt5也提供了QPdfWriter類來(lái)實(shí)現(xiàn)對(duì)pdf的操作,這里并不包括打開(kāi)pdf文件,Qt沒(méi)有提供任何方法來(lái)直接像文件瀏覽器一樣打開(kāi)pdf文件,可以用第三方庫(kù)來(lái)實(shí)現(xiàn)。

這里采用了圖片的方式來(lái)實(shí)現(xiàn)保存、預(yù)覽和打印,其實(shí) 三個(gè)功能基本上一樣。

1、保存PDF

(1)保存某個(gè)控件里的內(nèi)容

一些輸入類控件可以直接調(diào)用print()函數(shù),一些顯示類的控件可以直接調(diào)用render()函數(shù),一些控件不具備這個(gè)功能。代碼如下:

void MainWindow::on_btnSave_clicked()
{
 QString fileName = QFileDialog::getSaveFileName(this, tr("導(dǎo)出PDF文件"), QString(), "*.pdf");
 if (!fileName.isEmpty())
 {
 // 如果文件后綴為空,則默認(rèn)使用.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)保存某些控件里的內(nèi)容

這里需要將要保存的所有內(nèi)容放在一個(gè)容器里面,比如放在QWidget上,同樣可以用上面的方式來(lái)保存,下面用的是以圖片的方式來(lái)保存。代碼如下:

void MainWindow::on_btnSave_clicked()
{
 QString fileName = QFileDialog::getSaveFileName(this, tr("保存PDF文件"), QString(), "*.pdf");
 if (!fileName.isEmpty())
 {
 // 如果文件后綴為空,則默認(rèn)使用.pdf
 if (QFileInfo(fileName).suffix().isEmpty())
 {
  fileName.append(".pdf");
 }
 QPrinter printerPixmap(QPrinter::HighResolution);
 //自定義紙張大小,這里要打印的內(nèi)容都在stackedWidget上
 printerPixmap.setPageSize(QPrinter::Custom);
 printerPixmap.setPaperSize(QSizeF(ui->stackedWidget->height(), ui->stackedWidget->width()), QPrinter::Point);
 //設(shè)置紙張大小為A4,這里注釋掉了,建議自定義紙張 ,否則保存的就會(huì)有很多空白
 //printerPixmap.setPageSize(QPrinter::A4);
 //橫向打印
 printerPixmap.setOrientation(QPrinter::Landscape);
 //設(shè)置輸出格式為pdf
 printerPixmap.setOutputFormat(QPrinter::PdfFormat);
 //設(shè)置輸出路徑
 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();
 //將圖像(所有要畫(huà)的東西)在pdf上按比例尺縮放
 painterPixmap.scale(x, y);
 //畫(huà)圖
 painterPixmap.drawPixmap(0, 0, pixmap);
 painterPixmap.end();
 QMessageBox::information(this, tr("生成PDF"), tr("保存PDF文件成功"), QMessageBox::Ok);
 }
}

2、瀏覽

Qt沒(méi)有提供瀏覽pdf的方式,可以通過(guò)使用第三方庫(kù)Poppler來(lái)實(shí)現(xiàn),這里是相關(guān)文件:官網(wǎng),編譯好的庫(kù)文件,所有文件的文件包,實(shí)現(xiàn)pdf閱讀器??梢酝ㄟ^(guò)官方的源碼來(lái)編譯庫(kù),不過(guò)可能會(huì)非??部馈?/p>

我試了這個(gè)方法,不過(guò)沒(méi)有成功,(⊙﹏⊙)b!因?yàn)橹皇切枰獙?shí)現(xiàn)打開(kāi)pdf文件的一個(gè)小功能而不是實(shí)現(xiàn)類似pdf閱讀器,所以就換了一個(gè)方法,回頭搞閱讀器的時(shí)候還是得研究一番。

這里用的是進(jìn)程的方法來(lái)使用電腦上的閱讀器打開(kāi)文件,優(yōu)點(diǎn)是:簡(jiǎn)單,就兩行代碼;缺點(diǎn)是:①電腦上沒(méi)下載閱讀器就沒(méi)辦法了;②效率應(yīng)該沒(méi)有使用第三方庫(kù)高。

代碼如下:

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、預(yù)覽

預(yù)覽使用了預(yù)覽對(duì)話框QPrintPreviewDialog,也是用的圖片的方式來(lái)預(yù)覽pdf,其實(shí)預(yù)覽窗口已經(jīng)自帶了打印按鈕,在這個(gè)界面已經(jīng)可以打印了。代碼如下:

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、打印

打印使用了打印對(duì)話框QPrintDialog,如何打印文本框內(nèi)容的話直接用print()函數(shù)就行,否則還是用打印圖片的方式,和預(yù)覽不同的其實(shí)就是使用的窗口類不同其余都差不多,代碼如下:

void MainWindow::on_btnPrint_clicked()
{
 // 創(chuàng)建打印機(jī)對(duì)象
 QPrinter printer;
 // 創(chuàng)建打印對(duì)話框
 QString printerName = printer.printerName();
 if( printerName.size() == 0)
 return;
 QPrintDialog dlg(&printer, this);
 //如果編輯器中有選中區(qū)域,則打印選中區(qū)域
 if (ui->textEdit->textCursor().hasSelection())
 dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
 // 如果在對(duì)話框中按下了打印按鈕,則執(zhí)行打印操作
 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實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。

上一篇:C語(yǔ)言與Lua之間的相互調(diào)用詳解

欄    目:C語(yǔ)言

下一篇:基于C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

本文標(biāo)題:Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/958.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有