QT6 开发----QAxObject操作指南

文章介绍了QAxObject在Qt中作为COM对象的桥梁,如何通过querySubObject、dynamicCall和property方法操作Word等Office应用,如创建对象、访问子对象、动态调用方法和设置/获取属性。
摘要由CSDN通过智能技术生成

一.前言

        QAxObject可以实例化为一个空对象,并包含要操作的COM对象的名称,或者带有一个指向表示现有COM对象的IUnknown的指针。如果COM对象实现IDispatch接口,则该对象的属性、方法和事件将变为Qt属性、槽和信号。基类QAxBase提供了一个API,用于通过IUnknown指针直接访问COM对象。

QAxObject是一个QObject,可以这样使用,例如,可以组织在对象层次结构中,接收事件并连接到信号和插槽。

QAxObject还从QAxBase继承了大部分与ActiveX相关的功能,尤其是dynamicCall()和querySubObject()

因此,QAxObject简单概括为:可以调用系统基层功能通信COM接口,用QT的Qt属性、槽和信号来操作相关应用功能,例如对office软件的操作:word、excel等实现文本、图片、表格的操作,组建成自己软件的应用。

 二.QAxObject的主要函数

        QAxObject的主要函数有三个:querySubObject()、dynamicCall()和property属性设置等。

2.1 querySubObject()函数介绍

  querySubObject()QAxObject 类中的一个方法,用于获取 COM 对象中的子对象。在使用该方法时,需指定子对象的名称或者索引。该方法主要实现了访问 COM 对象中的子对象,并返回相应的 QAxObject 对象,方便我们对其进行操作。

  QAxObject 类用于访问 ActiveX 对象,ActiveX 对象是一种基于 COM(Component Object Model,组件对象模型)技术的可重用二进制组件,可以通过它们的公开接口来访问其功能和数据。COM 对象支持多个接口,因此可以通过不同的接口来实现不同的功能。在使用 querySubObject() 方法时,我们可以通过传递子对象的名称或者索引来获取相应的 QAxObject 对象。通过这个 QAxObject 对象,我们就可以访问到所需要的属性和方法,并进行相应的操作。

例如,在使用 Microsoft Word 的 COM 接口时,我们可以创建一个 Word.Application 对象,然后通过它的 Documents 属性获取 Documents 对象,再通过 Documents 对象的 Add() 方法添加一个新文档,最后通过 ActiveDocument 属性获取当前激活的文档。其中,Documents 对象和 ActiveDocument 对象都是 QAxObject 类型的对象,通过 querySubObject() 方法获取到。代码例子如下:

 QAxObject* word = new QAxObject("Word.Application");
 word->setProperty("Visible", true);
 QAxObject* documents = word->querySubObject("Documents");
 QAxObject* document = documents->querySubObject("Open(const QString&)", “filePath”);

                                                              代码片段2-1 

  1. QAxObject* word = new QAxObject("Word.Application");:创建一个名为 "Word.Application" 的 COM 对象,该对象对应的是 Microsoft Word 应用程序的实例。使用 new 关键字创建了一个指向该 COM 对象的 QAxObject 指针,命名为 word

  2. word->setProperty("Visible", true);:通过 setProperty() 方法设置 Visible 属性为 true,将 Word 应用程序设置为可见状态。

  3. QAxObject* documents = word->querySubObject("Documents");:通过 querySubObject() 方法获取 Documents 对象,即 Word 应用程序中的文档集合。使用了 documents 变量来保存这个返回的 QAxObject 对象。

  4. QAxObject* document = documents->querySubObject("Open(const QString&)", "filePath");:通过 querySubObject() 方法调用 Open 方法,打开一个指定路径的 Word 文档。在这个方法中,我们传递了一个 QString 类型的参数 "filePath",它代表了要打开的文档的文件路径。通过将这个路径传递给 Open 方法,我们可以打开对应的文档。使用了 document 变量来保存返回的表示打开的文档的 QAxObject 对象。

        以上代码的作用是启动 Word 应用程序,将其设置为可见状态,并打开一个指定路径的文档。通过 QAxObject 类和 COM 接口,我们可以操作 Word 应用程序和文档,执行各种操作,如读取内容、修改样式等。主要是对要操作的COM 对象的相关操作名称要清楚,这就是为什么在前言中强调QAxObject实例化为一个空对象要操作包含COM对象的名称,或者带有一个指向表示现有COM对象的IUnknown的指针的原因,即操作com对象的相关功能,逐级操作。

2.2 dynamicCall()函数介绍

   dynamicCall() 函数是 Qt 框架中的一个成员函数,用于动态调用对象的方法。它主要实现以下功能:

  1. 动态调用方法:通过 dynamicCall() 函数,可以在运行时动态调用对象的方法。这意味着可以根据具体的运行时条件选择不同的方法进行调用,而不需要在编译时确定调用哪个方法。

  2. 支持参数传递:dynamicCall() 函数可以传递方法所需的参数。参数可以是任意类型(基本类型、自定义类型等),并且支持传递多个参数。

  3. 处理返回值:dynamicCall() 函数可以处理方法的返回值。返回值可以是任意类型,包括基本类型、自定义类型、指针等。可以根据方法的返回类型来接收和处理返回值。

  4. 错误处理:dynamicCall() 函数能够处理方法调用过程中可能发生的错误。如果方法调用失败或者出现异常,可以通过捕获异常或者检查返回值来处理错误情况。

   dynamicCall() 函数提供了一种灵活的方式来动态调用对象,并处理方法的参数和返回值。它使得在运行时根据需要选择方法,并进行相应的操作成为可能。这对于需要在运行时根据条件调用不同方法的程序非常有用,例如插件系统、动态加载库等场景。

    // 获取所有的表格
    QAxObject* tables = document->querySubObject("Tables");
    //获取模板表格数量
    int tableCount = tables->property("Count").toInt();
    //获取第i个表格
    QAxObject* table = tables->querySubObject("Item(int)", i);
    //获取某row和column单元格对象的 Range 对象
    QAxObject* range=Table->querySubObject("Cell(int,int )",row,column)->querySubObject("Range");
    //向该单元格插入图片
    range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)",picPath);

                                                            代码片段2-2 

  1. QAxObject* tables = document->querySubObject("Tables");:通过 querySubObject() 方法获取文档中的所有表格集合 Tables 的对象。使用了 tables 变量来保存返回的 QAxObject 对象。

  2. int tableCount = tables->property("Count").toInt();:通过 property() 方法获取表格集合中的表格数量,并将其转换为整数类型。使用了 tableCount 变量来保存返回的表格数量。

  3. QAxObject* table = tables->querySubObject("Item(int)", i);:通过 querySubObject() 方法调用 Item 方法,获取第 i 个表格的对象。使用了 table 变量来保存返回的 QAxObject 对象。

  4. QAxObject* range = table->querySubObject("Cell(int, int)", row, column)->querySubObject("Range");:通过 querySubObject() 方法调用 Cell 方法,获取表格中特定行和列的单元格对象,并再次使用 querySubObject() 方法获取该单元格对象的 Range 对象。使用了 range 变量来保存返回的 QAxObject 对象。

  5. range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)", picPath);:首先通过 querySubObject() 方法获取 InlineShapes 对象,表示在单元格中插入的内联形状(如图片)。然后通过 dynamicCall() 方法调用 AddPicture 方法,将指定路径的图片添加到单元格中。在这里,我们传递了一个 QString 类型的参数 picPath,它表示要插入的图片的文件路径。

这段代码的作用是找到指定表格的特定单元格,并将指定路径的图片插入该单元格中。通过使用 QAxObject 类和 COM 接口,我们可以操作 Word 文档中的表格、单元格等对象,执行各种操作,如插入文本、修改格式。

2.3 property属性

        property分为setProperty和property两种,是 Qt 框架中的两个成员函数,用于设置和获取对象的属性。

  setProperty() 函数用于设置对象的属性值。它接受两个参数:属性的名称和属性的值。属性的名称通常是一个字符串,表示要设置的属性的名字。属性的值可以是任意类型,包括基本类型、自定义类型、指针等。该函数会将指定属性的值设置为传入的值。

   property() 函数用于获取对象的属性值。它接受一个参数:属性的名称。该函数会返回指定属性的值,属性的值可以是任意类型。如果对象没有指定属性或者属性不可读取,则返回一个无效的值。

        这两个函数提供了一种方便的方式来操作对象的属性。通过使用 setProperty(),可以动态地设置对象的属性值,而不需要直接访问对象的成员变量。通过使用 property(),可以获取对象的属性值,而不需要了解对象内部的实现细节。这使得代码更加模块化和可维护。通常,setProperty()property() 函数经常用于与 GUI 相关的编程中,用于设置和获取控件的各种属性,如文本、颜色、大小等。但它们也可以应用于其他类型的对象,只要对象支持属性的设置和获取操作。如代码片段2-1和2-2中的word->setProperty("Visible", true)int tableCount = tables->property("Count").toInt()用于设置和获取相关对象的属性,并进行相关操作。

三.QAxObject的参数传递

       在使用 QAxObject 类访问 COM 对象时,可以通过查询对象的文档或参考相关 API 文档来了解可用的属性和方法。对于 Word 的 COM 对象模型,可以查阅 Microsoft Office 的官方文档或搜索相关的 COM API 文档。这些文档会提供更详细的信息,帮助了解如何使用 QAxObject 类来操作 Word 文档。

后记

本文档上传了一份使用QAxObject编写操作word的接口,供大家学习参考,使用或者转发请注明连接地址

  • 32
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值