加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

QAxWidget打开Office文件及pdf

(2020-08-27 18:52:45)
开发环境:windows7+vs2013+qt5.4(32位)。
一、QAxwidget操作office:
 如果仅仅是使用QAxwidget来打开pdf文件还是较为简单的,网上也更多这方面的例子,但也基本上浅尝辄止,没有更深的内容了,很遗憾,我也是,如果要详细的api,需要直接去找com组件的api,但是我当时只看了pdf的api。
 使用QAXwidget操作office文件时,必须电脑装有office,office2007以上都可以(03没试过,未知),同时文档的路径必须是绝对路径,否则加载不会成功。
 准备工作:使用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-&gt   OpenExcel(filename);
            }
            else if(filename.endsWith(".docx") || filename.endsWith(".doc"))
            {
                this-&gt   OpenWord(filename);
            }
        }
    }
}
2、根据所选择的文件打开:
void MainWindow::OpenExcel(QString &filename)
{
    this-&gt   CloseOffice();
    officeContent_ = new QAxWidget("Excel.Application", this-&gt   ui-&gt   widget);
    officeContent_-&gt   dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
    officeContent_-&gt   setProperty("DisplayAlerts", false);
    auto rect = this-&gt   ui-&gt   widget-&gt   geometry();
    officeContent_-&gt    setGeometry(rect);
    officeContent_-&gt   setControl(filename);
    officeContent_-&gt   show();
}
void MainWindow::OpenWord(QString &filename)
{
    this-&gt   CloseOffice();
    officeContent_ = new QAxWidget("Word.Application", this-&gt   ui-&gt   widget);
    officeContent_-&gt   dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
    officeContent_-&gt   setProperty("DisplayAlerts", false);
    auto rect = this-&gt   ui-&gt   widget-&gt   geometry();
    officeContent_-&gt    setGeometry(rect);
    officeContent_-&gt   setControl(filename);
    officeContent_-&gt   show();
}
3、就打开了,效果如下(忽略word文档内容,以前的博客内容):
4、需要注意的是,使用完之后记得关干净,不然打开的word.exe还在进程。
void MainWindow::CloseOffice()
{
    if(this-&gt   officeContent_)
    {
        officeContent_-&gt   close();
        officeContent_-&gt   clear();
        delete officeContent_;
        officeContent_ = nullptr;
    }
}
二、QAxwidget操作pdf:
 其实打开pdf也类似,在放弃office文件之后选择了打开pdf文件。
 注意,需要安装adobe pdf reader:
 
1、在打开文件后选择分支处加一个选项:
else if(filename.endsWith(".docx") || filename.endsWith(".doc"))
 {
  this-&gt   OpenWord(filename);
 }
  else if(filename.endsWith(".pdf"))
  {
    this-&gt   OpenPdf(filename);
  }
2、打开pdf文件:
在布局上加一个类型gridLayout:
 
添加函数:
void MainWindow::OpenPdf(QString &filename)
{
    this-&gt   CloseOffice();
    officeContent_ = new QAxWidget(this);
    if(!officeContent_-&gt   setControl("Adobe PDF Reader"))
        QMessageBox::critical(this, "Error", "没有安装pdf!");
    this-&gt   ui-&gt   gridLayout-&gt   addWidget(officeContent_);
    officeContent_-&gt   dynamicCall(
                "LoadFile(const QString&)",
                filename);
}
这里有点不一样了,不能通过打开office的方式来直接打开。
有兴趣的话可以翻看官方文档,我找了好久找到了:传送门
3、完事儿,打开效果如下:
三、总结:
 通过QAxwidget来操作office文件和pdf文件,有以下几点优缺点:
1、很方便显示这些,几乎没什么代码量,直接可以看到效果。
2、本质其实就是调用别的软件来显示,跟自己没半毛钱关系,屏蔽不了按键,不能让他无法编辑,无法复制,无法保存,故而弃之。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有