QAxBase Class
QAxBase 类是一个抽象类,它提供了用于初始化和访问 COM 对象的 API。更多
头文件: | #include <QAxBase> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS AxContainer) target_link_libraries(mytarget PRIVATE Qt6::AxContainer) |
qmake: | QT += axcontainer |
继承于 |
公共类型
公共函数
virtual | ~QAxBase() |
QVariant | asVariant() const |
ulong | classContext() const |
void | clear() |
QString | control() const |
void | disableClassInfo() |
void | disableEventSink() |
void | disableMetaObject() |
QVariant | dynamicCall(const char *function, const QVariant &var1 = QVariant(), const QVariant &var2 = QVariant(), const QVariant &var3 = QVariant(), const QVariant &var4 = QVariant(), const QVariant &var5 = QVariant(), const QVariant &var6 = QVariant(), const QVariant &var7 = QVariant(), const QVariant &var8 = QVariant()) |
QVariant | dynamicCall(const char *function, QList<QVariant> &vars) |
QString | generateDocumentation() |
bool | isNull() const |
QAxBase::PropertyBag | propertyBag() const |
virtual bool | propertyWritable(const char *prop) const |
long | queryInterface(const QUuid &uuid, void **iface) const |
QAxObject * | querySubObject(const char *name, const QVariant &var1 = QVariant(), const QVariant &var2 = QVariant(), const QVariant &var3 = QVariant(), const QVariant &var4 = QVariant(), const QVariant &var5 = QVariant(), const QVariant &var6 = QVariant(), const QVariant &var7 = QVariant(), const QVariant &var8 = QVariant()) |
QAxObject * | querySubObject(const char *name, QList<QVariant> &vars) |
void | setClassContext(ulong classContext) |
void | setPropertyBag(const QAxBase::PropertyBag &bag) |
virtual void | setPropertyWritable(const char *prop, bool ok) |
QStringList | verbs() const |
受保护函数
QAxBase() | |
virtual bool | initialize(IUnknown **ptr) |
bool | initializeActive(IUnknown **ptr) |
bool | initializeFromFile(IUnknown **ptr) |
bool | initializeLicensed(IUnknown **ptr) |
bool | initializeRemote(IUnknown **ptr) |
详细说明
QAxBase 是一个抽象类,不能直接使用,需要通过子类QAxObject 和QAxWidget 进行实例化。该类提供了通过其 IUnknown 实现直接访问 COM 对象的 API。如果 COM 对象实现了 IDispatch 接口,则该对象的属性和方法将作为 Qt 属性和槽可用。
connect(buttonBack, SIGNAL(clicked()), webBrowser, SLOT(GoBack()));
对象的 IDispatch 实现所暴露的属性可通过 Qt Object Model(Qt 对象模型)提供的属性系统进行读写(两个子类都是QObjects,因此可以使用QObject::setProperty() 和QObject::property() )。不支持带有多个参数的属性。
activeX->setProperty("text", "some text"); int value = activeX->property("value");
可以使用dynamicCall() 直接调用属性的写入函数和对象的 IDispatch 实现所公开的其他方法,也可以作为连接到信号的槽间接调用。
webBrowser->dynamicCall("GoHome()");
COM 对象支持的传出事件将作为标准 Qt 信号发出。
QAxBase 可在 COM 数据类型和等效的 Qt 数据类型之间进行透明转换。有些 COM 类型没有对应的 Qt 数据结构。
下表第一列列出了支持的 COM 数据类型。第二列是可与QObject 属性函数一起使用的 Qt 类型。第三列是用于生成内参数信号和插槽原型的 Qt 类型,最后一列是用于外参数信号和插槽原型的 Qt 类型。
COM 类型 | Qt 属性 | 内参数 | 输出参数 |
---|---|---|---|
变量_BOOL | bool | bool | bool& |
BSTR | QString | constQString& | QString& |
char, short, int, long | 长 | int | int& |
uchar、ushort、uint、ulong | uint | uint | uint& |
浮点数、双 | 双 | 双 | 双 |
DATE | QDateTime | constQDateTime& | QDateTime& |
CY | qlonglong | qlonglong | qlonglong& |
OLE_COLOR | QColor | constQColor& | QColor& |
safearray(variant) | QList<QVariant> | constQList<QVariant>& | QList<QVariant>& |
SAFEARRAY(int), SAFEARRAY(double), SAFEARRAY(Date) | QList<QVariant> | constQList<QVariant>& | QList<QVariant>& |
safearray(byte) | QByteArray | constQByteArray& | QByteArray& |
safearray(bstr) | QStringList | constQStringList& | QStringList& |
变量 | 依赖类型 | constQVariant& | QVariant& |
IFontDisp* | QFont | constQFont& | QFont& |
IPictureDisp* | QPixmap | constQPixmap& | QPixmap& |
IDispatch* | QAxObject* | QAxBase::asVariant() | QAxObject* (返回值) |
未知 | QAxObject* | QAxBase::asVariant() | QAxObject* 返回值 |
SCODE, DECIMAL | 不支持 | 不支持 | 不支持 |
变量*(自 Qt 4.5 起) | 不支持 | QVariant& | QVariant& |
支持的类型还有枚举和类型定义。
要调用以下 IDL 描述的 COM 接口方法
dispinterface IControl { properties: [id(1)] BSTR text; [id(2)] IFontDisp *font; methods: [id(6)] void showColumn([in] int i); [id(3)] bool addColumn([in] BSTR t); [id(4)] int fillList([in, out] SAFEARRAY(VARIANT) *list); [id(5)] IDispatch *item([in] int i); };
可以这样使用 QAxBase API:
QAxObject object("<CLSID>"); QString text = object.property("text").toString(); object.setProperty("font", QFont("Times New Roman", 12)); connect(this, SIGNAL(clicked(int)), &object, SLOT(showColumn(int))); bool ok = object.dynamicCall("addColumn(const QString&)", "Column 1").toBool(); QList<QVariant> varlist; QList<QVariant> parameters; parameters << QVariant(varlist); int n = object.dynamicCall("fillList(QList<QVariant>&)", parameters).toInt(); QAxObject *item = object.querySubItem("item(int)", 5);
请注意,对象应填写的QList 必须作为QVariants 参数列表中的一个元素提供。
如果需要访问不支持的数据类型的属性或传递参数,则必须通过 COM 对象的IDispatch
实现或其他接口直接访问 COM 对象。这些接口可通过queryInterface() 获取。
IUnknown *iface = 0; activeX->queryInterface(IID_IUnknown, (void**)&iface); if (iface) { // use the interface iface->Release(); }
要获得 COM 接口的定义,必须使用要使用的组件所提供的头文件。有些编译器还可以使用 #import 编译器指令导入类型库。请参阅组件文档,了解需要导入哪些类型库以及如何使用它们。
如果需要对传递不支持的数据类型参数的事件做出反应,可以使用通用信号来传递 COM 事件所提供的事件数据。
另请参阅 QAxObject,QAxWidget,QAxScript 和ActiveQt Framework。
成员函数文档
[protected]
QAxBase::QAxBase()
创建 QAxBase 对象。
[virtual noexcept]
QAxBase::~QAxBase()
关闭 COM 对象并销毁QAxBase 对象。
另请参阅 clear().
QVariant QAxBase::asVariant() const
返回封装 COM 对象的QVariant 。然后,该变量可用作dynamicCall() 等程序的参数。
ulong QAxBase::classContext() const
返回 ActiveX 控件运行的上下文(默认为 CLSCTX_SERVER)。
另请参见 setClassContext()。
void QAxBase::clear()
断开连接并销毁 COM 对象。
如果重新实现该函数,还必须重新实现析构函数以调用 clear(),并在 clear() 函数结束时调用该实现。
QString QAxBase::control() const
返回 ActiveX 控件。
void QAxBase::disableClassInfo()
禁用此 ActiveX 容器的类信息生成。如果您不需要 ActiveX 控件的任何类信息,请使用此函数来加速元对象的生成。
请注意,必须在创建对象后立即调用此函数
void QAxBase::disableEventSink()
禁用此 ActiveX 容器的事件汇执行。如果您不打算监听 ActiveX 控件的事件,请使用此函数来加快元对象的生成。
某些 ActiveX 控件在连接到事件汇时可能会不稳定。要获取 OLE 事件,必须使用标准 COM 方法注册自己的事件汇。使用queryInterface() 访问原始 COM 对象。
请注意,应在创建对象后立即调用该函数。
void QAxBase::disableMetaObject()
禁用此 ActiveX 容器的元对象生成。这也会禁用事件槽和类信息的生成。如果您不打算使用 Qt 元对象实现,请调用此函数以加快控件的实例化。您仍然可以通过dynamicCall() 调用对象,但信号、插槽和属性将无法使用QObject API。
某些 ActiveX 控件在与 OLE 自动化一起使用时可能会不稳定。请使用标准 COM 方法,通过queryInterface() 提供的 COM 接口使用这些控件。
请注意,必须在创建对象后立即调用此函数。
QVariant QAxBase::dynamicCall(const char *function, const QVariant &var1 = QVariant(), const QVariant &var2 = QVariant(), const QVariant &var3 = QVariant(), const QVariant &var4 = QVariant(), const QVariant &var5 = QVariant(), const QVariant &var6 = QVariant(), const QVariant &var7 = QVariant(), const QVariant &var8 = QVariant())
调用 COM 对象的方法function ,传递参数var1,var1,var2,var3,var4,var5,var6,var7 和var8 ,并返回方法返回的值,如果方法不返回值或函数调用失败,则返回无效的QVariant 。
如果function 是对象的一个方法,则必须提供字符串的完整原型,例如在QObject::connect() 调用中的写法。
activeX->dynamicCall("Navigate(const QString&)", "www.qt-project.org");
另外,也可以通过字符串中嵌入的参数来调用函数,例如,上述函数也可以通过以下方式调用
activeX->dynamicCall("Navigate(\"www.qt-project.org\")");
所有参数都以字符串形式传递;能否正确解释这些参数取决于控件,而且比使用带有正确类型参数的原型要慢。
如果function 是一个属性,字符串必须是该属性的名称。如果var1 是一个有效的QVariant ,则调用属性设置器,否则调用获取器。
activeX->dynamicCall("Value", 5); QString text = activeX->dynamicCall("Text").toString();
请注意,使用QObject::property() 和QObject::setProperty() 获取和设置属性更快。
动态调用()也可用于调用带有disabled metaobject 封装器的对象,这可以显著提高性能,尤其是在自动化过程中调用许多不同类型的对象时。但是,ActiveQt 不会验证参数。
只能通过 dynamicCall() 调用具有QVariant 支持的数据类型的参数或返回值的函数。有关支持和不支持的数据类型列表,请参阅QAxBase 类文档。如果要调用参数列表中不支持数据类型的函数,可使用queryInterface() 获取相应的 COM 接口,然后直接使用该函数。
IWebBrowser2 *webBrowser = 0; activeX->queryInterface(IID_IWebBrowser2, (void **)&webBrowser); if (webBrowser) { webBrowser->Navigate2(pvarURL); webBrowser->Release(); }
这样也更有效。
QVariant QAxBase::dynamicCall(const char *function, QList<QVariant> &vars)
这是一个重载函数。
调用 COM 对象的方法function ,传递vars 中的参数,并返回该方法返回的值。如果方法没有返回值或函数调用失败,该函数将返回一个无效的QVariant 对象。
当方法有输出参数时,将更新vars 中的QVariant 对象。
QString QAxBase::generateDocumentation()
返回富文本字符串,其中包含封装 COM 对象的文档。将字符串转存到 HTML 文件,或在QTextBrowser widget 中使用。
[virtual protected]
bool QAxBase::initialize(IUnknown **ptr)
此虚函数由 setControl() 调用,并创建所请求的 COM 对象。ptr 被设置为对象的 IUnknown 实现。如果对象初始化成功,函数返回 true;否则返回 false。
默认实现将解释control() 返回的字符串,如果字符串与相应模式匹配,则调用initializeRemote()、initializeLicensed() 或initializeActive() 。如果control() 是现有文件的名称,则会调用initializeFromFile()。如果没有匹配的模式,或者远程或授权初始化失败,则直接使用 CoCreateInstance 创建对象。
有关支持模式的详细信息,请参阅QAxBaseWidget::control 属性文档。
当该函数返回时,ptr 中返回的接口必须被准确引用一次。例如,CoCreateInstance 提供的接口已被引用,因此无需再次引用。
[protected]
bool QAxBase::initializeActive(IUnknown **ptr)
连接当前机器上运行的活动实例,并在ptr 中返回运行对象的 IUnknown 接口。如果连接成功,该函数返回 true,否则返回 false。
如果控制字符串包含子字符串"}&",initialize() 将调用此函数。
另请参见 initialize()。
[protected]
bool QAxBase::initializeFromFile(IUnknown **ptr)
创建 COM 对象,处理控制属性中的文件名,并在ptr 中返回对象的 IUnknown 接口。如果创建成功,该函数返回 true,否则返回 false。
如果控制字符串是现有文件的名称,则initialize() 将调用此函数。
另请参见 initialize()。
[protected]
bool QAxBase::initializeLicensed(IUnknown **ptr)
创建许可控件的实例,并在ptr 中返回对象的 IUnknown 接口。如果创建成功,该函数返回 true,否则返回 false。
如果控件字符串包含子字符串"}:",则initialize() 将调用此函数。许可证密钥需要跟在该子串之后。
另请参见 initialize()。
[protected]
bool QAxBase::initializeRemote(IUnknown **ptr)
在远程服务器上创建实例,并在ptr 中返回对象的 IUnknown 接口。如果创建成功,该函数返回 true,否则返回 false。
如果控制字符串包含子字符串"/{",则initialize() 将调用该函数。需要在子串前提供远程机器的信息。
另请参阅 initialize()。
bool QAxBase::isNull() const
如果此包装器没有加载 COM 对象,则返回 true;否则返回 false。
另请参阅 control().
QAxBase::PropertyBag QAxBase::propertyBag() const
返回 COM 对象公开的所有属性的名称:值映射。
如果 COM 对象支持属性包,这比单独获取多个属性更有效。
警告 不保证 COM 对象的属性袋实现会返回所有属性,也不保证返回的属性与 IDispatch 接口提供的属性相同。
另请参阅 setPropertyBag().
[virtual]
bool QAxBase::propertyWritable(const char *prop) const
如果prop 属性可写,则返回 true;否则返回 false。默认情况下,所有属性都是可写的。
警告: 根据控件实现的不同,某些属性的设置可能会被忽略。
另请参阅 setPropertyWritable(),QAxBaseWidget::propertyChanged() 和QAxBaseObject::propertyChanged()。
long QAxBase::queryInterface(const QUuid &uuid, void **iface) const
请求 COM 对象提供接口uuid ,并将iface 的值设置为所提供的接口;如果无法提供所请求的接口,则将 的值设置为 0。
返回 COM 对象的 QueryInterface 实现结果。
另请参阅 control().
QAxObject *QAxBase::querySubObject(const char *name, const QVariant &var1 = QVariant(), const QVariant &var2 = QVariant(), const QVariant &var3 = QVariant(), const QVariant &var4 = QVariant(), const QVariant &var5 = QVariant(), const QVariant &var6 = QVariant(), const QVariant &var7 = QVariant(), const QVariant &var8 = QVariant())
返回一个指向QAxObject 的指针,该指针封装了由方法或属性name 提供的 COM 对象,传递参数var1,var1,var2,var3,var4,var5,var6,var7 和var8 。
如果name 由方法提供,字符串必须包括完整的函数原型。
如果name 是一个属性,字符串必须是该属性的名称,而var1, ...var8 将被忽略。
返回的QAxObject 是本对象(类型为QAxObject 或QAxWidget )的子对象,并在删除本对象时被删除。不过,自己删除返回的对象是安全的,在遍历子对象列表时应该这样做。
启用 COM 的应用程序通常都有一个对象模型,将应用程序的某些元素发布为调度接口。使用该方法可以浏览对象模型的层次结构,例如
QAxWidget outlook("Outlook.Application"); QAxObject *session = outlook.querySubObject("Session"); if (session) { QAxObject *defFolder = session->querySubObject( "GetDefaultFolder(OlDefaultFolders)", "olFolderContacts"); //... }
QAxObject *QAxBase::querySubObject(const char *name, QList<QVariant> &vars)
这是一个重载函数。
当方法有输出参数时,vars 中的QVariant 对象会被更新。
void QAxBase::setClassContext(ulong classContext)
设置 ActiveX 控件运行的上下文。classContext
影响调用 CoCreateInstance 时的 "dwClsContext "参数。这可用于控制支持两种启动方式的控件在程序内启动与在程序外启动。此外,当与 CLSCTX_ENABLE_CLOAKING 和冒充令牌一起使用时,它还可用于修改/减少控制权限。
请注意,该函数必须在 setControl() 之前调用才能生效。
另请参阅 classContext()。
void QAxBase::setPropertyBag(const QAxBase::PropertyBag &bag)
将 COM 对象的属性设置为bag 中的相应值。
警告 只能设置propertyBag 函数返回的属性包,因为无法保证 COM 对象的属性包实现支持通过 IDispatch 接口提供的相同属性。
另请参阅 propertyBag() 。
[virtual]
void QAxBase::setPropertyWritable(const char *prop, bool ok)
如果ok 为 true,则将prop 属性设置为可写,否则将prop 设置为只读。默认情况下,所有属性都是可写的。
警告: 根据控件实现的不同,某些属性的设置可能会被忽略。
另请参阅 propertyWritable(),QAxBaseWidget::propertyChanged() 和QAxBaseObject::propertyChanged()。
QStringList QAxBase::verbs() const
返回 COM 对象可执行的动词列表。如果对象未实现 IOleObject 或不支持任何动词,则此函数将返回空字符串列表。
请注意,列表中不包括 OLE 默认动词(OLEIVERB_SHOW 等)。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.