1. 程式人生 > >Qt顯示pdf系列2——QAxWidget開啟Office檔案及pdf

Qt顯示pdf系列2——QAxWidget開啟Office檔案及pdf

 承接上章,該扯皮的扯完了,直接進入正題:

顧名思義,這篇先介紹下QAxwidget來操作office和pdf
 QAxwidget,即一個ActiveX控制元件的qt版本,方便我們在qt程式中呼叫顯示,可以直接呼叫com元件。關於QAxwidget的介紹,官網上有更詳細的,可以自行檢視:
QAxwidget官網介紹
此外,引用別人的一張圖,能夠更好理解繼承結構:
這裡寫圖片描述
傳送門

開發環境:windows7+vs2013+qt5.4(32位)。

一、QAxwidget操作office:

 如果僅僅是使用QAxwidget來開啟pdf檔案還是較為簡單的,網上也更多這方面的例子,但也基本上淺嘗輒止,沒有更深的內容了,很遺憾,我也是,如果要詳細的api,需要直接去找com元件的api,但是我當時只看了pdf的api。

使用QAXwidget操作office檔案時,必須電腦裝有office,office2007以上都可以(03沒試過,未知),同時qt5.7如果是呼叫dilaog開啟檔案來顯示有效果,如果是直接load沒效果,大約是一個bug。

準備工作:使用QAxwidget需要新增庫:

QT       += axcontainer 

1、搞個簡單的介面:
這裡寫圖片描述
點選按鈕打開個檔案選擇框(QFileDialog),根據選擇檔案來確定開啟的檔案格式

void MainWindow::on_pushButton_clicked()
{
    QFileDialog dialog;
    dialog.
setFileMode(QFileDialog::ExistingFile); dialog.setViewMode(QFileDialog::Detail); dialog.setOption(QFileDialog::ReadOnly, true); dialog.setWindowTitle(QString("QAXwidget操作檔案")); dialog.setDirectory(QString("./")); dialog.setNameFilter(QString("所有檔案(*.*);;excel(*.xlsx);;word(*.docx *.doc);;pdf(*.pdf)"
)); if (dialog.exec()) { //根據檔案字尾開啟 QStringList files = dialog.selectedFiles(); for(auto filename : files) { if(filename.endsWith(".xlsx")) { this->OpenExcel(filename); } else if(filename.endsWith(".docx") || filename.endsWith(".doc")) { this->OpenWord(filename); } } } }

2、根據所選擇的檔案開啟:

void MainWindow::OpenExcel(QString &filename)
{
    this->CloseOffice();
    officeContent_ = new QAxWidget("Excel.Application", this->ui->widget);
    officeContent_->dynamicCall("SetVisible (bool Visible)","false");//不顯示窗體
    officeContent_->setProperty("DisplayAlerts", false);
    auto rect = this->ui->widget->geometry();
    officeContent_-> setGeometry(rect);
    officeContent_->setControl(filename);
    officeContent_->show();
}

void MainWindow::OpenWord(QString &filename)
{
    this->CloseOffice();
    officeContent_ = new QAxWidget("Word.Application", this->ui->widget);
    officeContent_->dynamicCall("SetVisible (bool Visible)","false");//不顯示窗體
    officeContent_->setProperty("DisplayAlerts", false);
    auto rect = this->ui->widget->geometry();
    officeContent_-> setGeometry(rect);
    officeContent_->setControl(filename);
    officeContent_->show();
}

3、就打開了,效果如下(忽略word文件內容,以前的部落格內容):
這裡寫圖片描述

4、需要注意的是,使用完之後記得關乾淨,不然開啟的word.exe還在程序。

void MainWindow::CloseOffice()
{
    if(this->officeContent_)
    {
        officeContent_->close();
        officeContent_->clear();
        delete officeContent_;
        officeContent_ = nullptr;
    }
}

二、QAxwidget操作pdf:

 其實開啟pdf也類似,在放棄office檔案之後選擇了開啟pdf檔案。
 注意,需要安裝adobe pdf reader:
這裡寫圖片描述
1、在開啟檔案後選擇分支處加一個選項:

 else if(filename.endsWith(".docx") || filename.endsWith(".doc"))
 {
  this->OpenWord(filename);
 }
  else if(filename.endsWith(".pdf"))
  {
    this->OpenPdf(filename);
  }

2、開啟pdf檔案:
在佈局上加一個型別gridLayout:
這裡寫圖片描述
新增函式:

void MainWindow::OpenPdf(QString &filename)
{
    this->CloseOffice();
    officeContent_ = new QAxWidget(this);
    if(!officeContent_->setControl("Adobe PDF Reader"))
        QMessageBox::critical(this, "Error", "沒有安裝pdf!");
    this->ui->gridLayout->addWidget(officeContent_);
    officeContent_->dynamicCall(
                "LoadFile(const QString&)",
                filename);
}

這裡有點不一樣了,不能通過開啟office的方式來直接開啟。
有興趣的話可以翻看官方文件,我找了好久找到了:傳送門

3、完事兒,開啟效果如下:
這裡寫圖片描述

三、總結:

 通過QAxwidget來操作office檔案和pdf檔案,有以下幾點優缺點:
1、很方便顯示這些,幾乎沒什麼程式碼量,直接可以看到效果。
2、本質其實就是呼叫別的軟體來顯示,跟自己沒半毛錢關係,遮蔽不了按鍵,不能讓他無法編輯,無法複製,無法儲存,故而棄之。
3、需要原始碼的話可以留評論,我再上傳。

更新:
程式碼地址:
傳送門