最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年01月17日 10:15:13   作者:畫繭自縛  
下面小編就為大家分享一篇Qt實現(xiàn)保存、瀏覽、預覽、打印功能的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

1、保存PDF

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

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

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)保存某些控件里的內(nèi)容

這里需要將要保存的所有內(nèi)容放在一個容器里面,比如放在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);
 //自定義紙張大小,這里要打印的內(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來實現(xiàn),這里是相關(guān)文件:官網(wǎng),編譯好的庫文件,所有文件的文件包實現(xiàn)pdf閱讀器。可以通過官方的源碼來編譯庫,不過可能會非常坎坷。

我試了這個方法,不過沒有成功,(⊙﹏⊙)b!因為只是需要實現(xiàn)打開pdf文件的一個小功能而不是實現(xiàn)類似pdf閱讀器,所以就換了一個方法,回頭搞閱讀器的時候還是得研究一番。

這里用的是進程的方法來使用電腦上的閱讀器打開文件,優(yōu)點是:簡單,就兩行代碼;缺點是:①電腦上沒下載閱讀器就沒辦法了;②效率應該沒有使用第三方庫高。

代碼如下:

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,其實預覽窗口已經(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ù)就行,否則還是用打印圖片的方式,和預覽不同的其實就是使用的窗口類不同其余都差不多,代碼如下:

void MainWindow::on_btnPrint_clicked()
{
 // 創(chuàng)建打印機對象
 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實現(xiàn)保存、瀏覽、預覽、打印功能的示例代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Qt?TCP網(wǎng)絡(luò)通信學習

    Qt?TCP網(wǎng)絡(luò)通信學習

    用于數(shù)據(jù)傳輸?shù)牡蛯泳W(wǎng)絡(luò)協(xié)議,多個物聯(lián)網(wǎng)協(xié)議都是基于TCP協(xié)議的,這篇文章為大家介紹了Qt?TCP網(wǎng)絡(luò)通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 一文讀懂C++中指針和內(nèi)存分配

    一文讀懂C++中指針和內(nèi)存分配

    我們知道聲明的所有變量在內(nèi)存中都有一個特定的地址。聲明一個指針變量來指向內(nèi)存中的這些地址,這篇文章主要介紹了C++中指針和內(nèi)存分配,需要的朋友參考下吧
    2021-06-06
  • C++讀取wav文件中的PCM數(shù)據(jù)

    C++讀取wav文件中的PCM數(shù)據(jù)

    這篇文章主要為大家詳細介紹了C++讀取wav文件中的PCM數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 帶你粗略了解C++流的讀寫文件

    帶你粗略了解C++流的讀寫文件

    這篇文章主要為大家總結(jié)了C++中輸入輸出流及文件流操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • Visual Studio 2019修改編碼UTF-8的實現(xiàn)

    Visual Studio 2019修改編碼UTF-8的實現(xiàn)

    這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 一些C語言中字符串的算法問題解決實例小結(jié)

    一些C語言中字符串的算法問題解決實例小結(jié)

    這篇文章主要介紹了一些C語言中字符串的算法問題解決實例小結(jié),包括將字符串轉(zhuǎn)化為int類型的數(shù)及旋轉(zhuǎn)字符串等操作,需要的朋友可以參考下
    2016-03-03
  • C++ 創(chuàng)建桌面快捷方式 開始菜單的實現(xiàn)代碼

    C++ 創(chuàng)建桌面快捷方式 開始菜單的實現(xiàn)代碼

    這篇文章介紹了C++ 創(chuàng)建桌面快捷方式,開始菜單的實現(xiàn)代碼,需要的朋友可以參考一下
    2013-06-06
  • 詳解C語言之堆棧

    詳解C語言之堆棧

    這篇文章主要為大家介紹了C語言的堆棧,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字

    C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字

    在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • OpenMP 共享內(nèi)存的并行編程框架入門詳解

    OpenMP 共享內(nèi)存的并行編程框架入門詳解

    這篇文章主要為大家介紹了OpenMP 共享內(nèi)存的并行編程框架入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

长海县| 丰台区| 荆门市| 龙口市| 太白县| 镇安县| 芦溪县| 七台河市| 常州市| 故城县| 海口市| 海安县| 卢龙县| 梅州市| 托克托县| 北安市| 临猗县| 浮梁县| 怀化市| 樟树市| 博爱县| 曲阜市| 罗定市| 乌兰浩特市| 驻马店市| 江都市| 巴楚县| 建平县| 桂阳县| 方正县| 陇南市| 周口市| 灵石县| 凤台县| 夏津县| 丘北县| 广宗县| 右玉县| 讷河市| 蛟河市| 五常市|