一.前言
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
-
QAxObject* word = new QAxObject("Word.Application");
:创建一个名为 "Word.Application" 的 COM 对象,该对象对应的是 Microsoft Word 应用程序的实例。使用new
关键字创建了一个指向该 COM 对象的QAxObject
指针,命名为word
。 -
word->setProperty("Visible", true);
:通过setProperty()
方法设置Visible
属性为true
,将 Word 应用程序设置为可见状态。 -
QAxObject* documents = word->querySubObject("Documents");
:通过querySubObject()
方法获取Documents
对象,即 Word 应用程序中的文档集合。使用了documents
变量来保存这个返回的QAxObject
对象。 -
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 框架中的一个成员函数,用于动态调用对象的方法。它主要实现以下功能:
-
动态调用方法:通过
dynamicCall()
函数,可以在运行时动态调用对象的方法。这意味着可以根据具体的运行时条件选择不同的方法进行调用,而不需要在编译时确定调用哪个方法。 -
支持参数传递:
dynamicCall()
函数可以传递方法所需的参数。参数可以是任意类型(基本类型、自定义类型等),并且支持传递多个参数。 -
处理返回值:
dynamicCall()
函数可以处理方法的返回值。返回值可以是任意类型,包括基本类型、自定义类型、指针等。可以根据方法的返回类型来接收和处理返回值。 -
错误处理:
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
-
QAxObject* tables = document->querySubObject("Tables");
:通过querySubObject()
方法获取文档中的所有表格集合Tables
的对象。使用了tables
变量来保存返回的QAxObject
对象。 -
int tableCount = tables->property("Count").toInt();
:通过property()
方法获取表格集合中的表格数量,并将其转换为整数类型。使用了tableCount
变量来保存返回的表格数量。 -
QAxObject* table = tables->querySubObject("Item(int)", i);
:通过querySubObject()
方法调用Item
方法,获取第i
个表格的对象。使用了table
变量来保存返回的QAxObject
对象。 -
QAxObject* range = table->querySubObject("Cell(int, int)", row, column)->querySubObject("Range");
:通过querySubObject()
方法调用Cell
方法,获取表格中特定行和列的单元格对象,并再次使用querySubObject()
方法获取该单元格对象的Range
对象。使用了range
变量来保存返回的QAxObject
对象。 -
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的接口,供大家学习参考,使用或者转发请注明连接地址