本页内容

QAxBase Class

QAxBase 类是一个抽象类,它提供了一组 API 用于初始化和访问 COM 对象。更多内容...

头文件: #include <qaxbase.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS AxContainer)
target_link_libraries(mytarget PRIVATE Qt6::AxContainer)
qmake: QT += axcontainer
由以下函数继承:

QAxObject 以及QAxWidget

公共类型

公共函数

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 进行实例化。该类提供了一套 API,可通过其 IUnknown 实现直接访问 COM 对象。如果 COM 对象实现了 IDispatch 接口,则该对象的属性和方法将作为 Qt 属性和槽(slot)提供。

connect(buttonBack, SIGNAL(clicked()), webBrowser, SLOT(GoBack()));

对象的 IDispatch 实现所公开的属性可通过 Qt 对象模型提供的属性系统进行读写(这两个子类都是QObject,因此您可以使用QObject::setProperty() 和QObject::property())。不支持具有多个参数的属性。

activeX->setProperty("text", "some text");
int value = activeX->property("value");

对象的 IDispatch 实现所公开的属性的写入函数和其他方法,可以使用dynamicCall() 直接调用,或者作为连接到信号的槽间接调用。

webBrowser->dynamicCall("GoHome()");

COM 对象支持的发出事件将作为标准的 Qt 信号发出。

connect(webBrowser, SIGNAL(TitleChanged(QString)),
        this, SLOT(setCaption(QString)));

QAxBase 会在 COM 数据类型与等效的 Qt 数据类型之间进行透明转换。某些 COM 类型没有等效的 Qt 数据结构。

支持的 COM 数据类型列在下表的第一列中。 第二列是可与QObject 属性函数一起使用的 Qt 类型。第三列是在生成的信号和槽的原型中用于输入参数的 Qt 类型,最后一列是在生成的信号和槽的原型中用于输出参数的 Qt 类型。

COM 类型Qt属性输入参数输出参数
VARIANT_BOOLboolboolbool&
BSTRQStringconstQString&QString&
char、short、int、longintintint&
uchar、ushort、uint、ulonguintuintuint&
float、doubledoubledoubledouble&
DATEQDateTimeconstQDateTime&QDateTime&
CYqlonglongqlonglongqlonglong&
OLE_COLORQColorconstQColor&QColor&
SAFEARRAY(VARIANT)QList<QVariant>constQList<QVariant>&QList<QVariant>&
SAFEARRAY(int)、SAFEARRAY(double)、SAFEARRAY(Date)QList<QVariant>constQList<QVariant>&QList<QVariant>&
SAFEARRAY(BYTE)QByteArrayconstQByteArray&QByteArray&
SAFEARRAY(BSTR)QStringListconstQStringList&QStringList&
VARIANT取决于类型constQVariant&QVariant&
IFontDisp*QFontconstQFont&QFont&
IPictureDisp*QPixmapconstQPixmap&QPixmap&
IDispatch*QAxObject*QAxBase::asVariant()QAxObject*(返回值)
IUnknown*QAxObject*QAxBase::asVariant()QAxObject*(返回值)
SCODE, DECIMAL不支持不支持不支持
VARIANT*(自 Qt 4.5 起)不支持QVariant&QVariant&

枚举类型以及对受支持类型的 typedef 也受支持。

要调用由以下 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 必须作为QVariant参数列表中的一个元素提供。

如果您需要访问属性或传递不受支持数据类型的参数,则必须通过该对象的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 框架。

成员类型文档

[alias] QAxBase::PropertyBag

一个QMap<QString,QVariant>,可将属性以“名称:值”对的形式存储。

成员函数文档

[protected] QAxBase::QAxBase()

创建一个 QAxBase 对象。

[virtual noexcept] QAxBase::~QAxBase()

关闭 COM 对象并销毁QAxBase 对象。

另请参阅 clear()。

QVariant QAxBase::asVariant() const

返回一个封装了 COM 对象的 `QVariant ` 对象。随后,该 Variant 对象可作为参数用于诸如 `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() 获取和设置属性速度更快。

dynamicCall() 还可以用于调用带有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 控件中。

[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 对象,并将该对象的 IUnknown 接口返回给ptr 。如果操作成功,该函数返回 true;否则返回 false。

如果控件字符串是现有文件的名称,则由initialize() 调用此函数。

另请参阅 initialize()。

[protected] bool QAxBase::initializeLicensed(IUnknown **ptr)

创建一个已授权控件的实例,并通过ptr 返回该对象的IUnknown接口。若操作成功,该函数返回true;否则返回false。

如果控件字符串中包含子字符串“}:”,则由initialize()调用此函数。许可证密钥必须紧跟在此子字符串之后。

另请参阅 initialize()。

[protected] bool QAxBase::initializeRemote(IUnknown **ptr)

在远程服务器上创建实例,并将该对象的 IUnknown 接口返回给ptr 。如果成功,该函数返回 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 ` 为真,则将属性 `prop ` 设置为可写;否则将 `prop ` 设置为只读。默认情况下,所有属性均为可写。

警告:根据 控件的实现情况,此设置对于某些属性可能会被忽略。

另请参阅 propertyWritable()、QAxBaseWidget::propertyChanged() 和QAxBaseObject::propertyChanged()。

QStringList QAxBase::verbs() const

返回 COM 对象可执行的动词列表。如果该对象未实现 IOleObject 接口,或者不支持任何动词,则此函数返回一个空字符串列表。

请注意,该列表中不包含 OLE 默认动词(如 OLEIVERB_SHOW 等)。

© 2026 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.