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、需要原始碼的話可以留評論,我再上傳。
更新:
程式碼地址:
傳送門