Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼
Qt提供了以文本、圖片、HTML等方式來實(shí)現(xiàn)對文檔的操作,主要用到了QPrinter類和QPainter類,用到了QFileDialog文件窗口、QPrintPreviewDialog預(yù)覽窗口類和QPrintDialog打印窗口類,Qt5也提供了QPdfWriter類來實(shí)現(xiàn)對pdf的操作,這里并不包括打開pdf文件,Qt沒有提供任何方法來直接像文件瀏覽器一樣打開pdf文件,可以用第三方庫來實(shí)現(xiàn)。
這里采用了圖片的方式來實(shí)現(xiàn)保存、預(yù)覽和打印,其實(shí) 三個功能基本上一樣。
1、保存PDF
(1)保存某個控件里的內(nèi)容
一些輸入類控件可以直接調(diào)用print()函數(shù),一些顯示類的控件可以直接調(diào)用render()函數(shù),一些控件不具備這個功能。代碼如下:
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)容放在一個容器里面,比如放在QWidget上,同樣可以用上面的方式來保存,下面用的是以圖片的方式來保存。代碼如下:
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,這里注釋掉了,建議自定義紙張 ,否則保存的就會有很多空白 //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(); //將圖像(所有要畫的東西)在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來實(shí)現(xiàn),這里是相關(guān)文件:官網(wǎng),編譯好的庫文件,所有文件的文件包,實(shí)現(xiàn)pdf閱讀器。可以通過官方的源碼來編譯庫,不過可能會非常坎坷。
我試了這個方法,不過沒有成功,(⊙﹏⊙)b!因為只是需要實(shí)現(xiàn)打開pdf文件的一個小功能而不是實(shí)現(xiàn)類似pdf閱讀器,所以就換了一個方法,回頭搞閱讀器的時候還是得研究一番。
這里用的是進(jìn)程的方法來使用電腦上的閱讀器打開文件,優(yōu)點(diǎn)是:簡單,就兩行代碼;缺點(diǎn)是:①電腦上沒下載閱讀器就沒辦法了;②效率應(yīng)該沒有使用第三方庫高。
代碼如下:
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ù)覽對話框QPrintPreviewDialog,也是用的圖片的方式來預(yù)覽pdf,其實(shí)預(yù)覽窗口已經(jīng)自帶了打印按鈕,在這個界面已經(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、打印
打印使用了打印對話框QPrintDialog,如何打印文本框內(nèi)容的話直接用print()函數(shù)就行,否則還是用打印圖片的方式,和預(yù)覽不同的其實(shí)就是使用的窗口類不同其余都差不多,代碼如下:
void MainWindow::on_btnPrint_clicked() { // 創(chuàng)建打印機(jī)對象 QPrinter printer; // 創(chuàng)建打印對話框 QString printerName = printer.printerName(); if( printerName.size() == 0) return; QPrintDialog dlg(&printer, this); //如果編輯器中有選中區(qū)域,則打印選中區(qū)域 if (ui->textEdit->textCursor().hasSelection()) dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection); // 如果在對話框中按下了打印按鈕,則執(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ù)覽、打印功能的示例代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持我們。
欄 目:C語言
下一篇:基于C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)
本文標(biāo)題:Qt實(shí)現(xiàn)保存、瀏覽、預(yù)覽、打印功能的示例代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/958.html
您可能感興趣的文章
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10求斐波那契(Fibonacci)數(shù)列通項的七種實(shí)現(xiàn)方法
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運(yùn)算符做加法
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10深入全排列算法及其實(shí)現(xiàn)方法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10用C語言實(shí)現(xiàn)單鏈表的各種操作(一)
- 01-10用C語言實(shí)現(xiàn)單鏈表的各種操作(二)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子