QAxBase类
QAxBase类是一个抽象类,它提供了一个API来初始化和访问COM对象。更多信息...
头文件 | #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对象模型提供的属性系统进行读写(这两个子类都是QObject,所以可以使用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属性 | 输入参数 | 输出参数 |
---|---|---|---|
VARIANT_BOOL | bool | bool | bool& |
BSTR | QString | const QString&& | QString& |
char, short, int, long | int | int | int& |
uchar, ushort, uint, ulong | uint | uint | uint& |
float, double | double | double | double& |
DATE | QDateTime | const QDateTime&& | QDateTime& |
CY | qlonglong | qlonglong | qlonglong& |
OLE_COLOR | QColor | const QColor&& | QColor& |
SAFEARRAY(VARIANT) | QList<QVariant> | const QList<QVariant>&& | QList<QVariant>&& |
SAFEARRAY(int), SAFEARRAY(double), SAFEARRAY(Date) | QList<QVariant> | const QList<QVariant>&& | QList<QVariant>&& |
SAFEARRAY(BYTE) | QByteArray | const QByteArray&& | QByteArray& |
SAFEARRAY(BSTR) | QStringList | const QStringList&& | QStringList& |
VARIANT | 依赖于类型 | const QVariant&& | QVariant& |
IFontDisp* | QFont | const QFont&& | QFont& |
IPictureDisp* | QPixmap | const QPixmap&& | 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的参数列表中的一个元素提供。
如果您需要访问不支持数据类型的属性或传递参数,您必须通过 COM 对象的 IDispatch
实现或其他接口直接访问。这些接口可以通过 queryInterface() 获取。
IUnknown *iface = 0; activeX->queryInterface(IID_IUnknown, (void**)&iface); if (iface) { // use the interface iface->Release(); }
要获取 COM 接口的定义,您必须使用随组件提供的头文件。一些编译器也可以使用 #import 编译器指令导入类型库。请查阅组件文档,以了解需要导入哪些类型库以及如何使用它们。
如果您需要响应传递不支持数据类型参数的事件,可以使用传递 COM 事件数据的通用信号。
另请参阅 QAxObject、QAxWidget、QAxScript 和 ActiveQt 框架。
成員函數文檔
[受保護]
QAxBase::QAxBase()
創建一個 QAxBase 對象。
[虛擬 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接口使用这些控件。
请注意,必须在对象 konstruktion后立即调用此函数。
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,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()还可以用来调用具有禁用元对象包装器的对象,这将显著提高性能,尤其是在自动化过程中调用许多不同类型的对象时。但是,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对象,并在ptr中返回对象的IUnknown接口。如果成功,此函数返回true,否则返回false。
如果控制字符串是现有文件名,则该函数由 initialize() 调用。
另请参阅initialize()。
[受保护的]
bool QAxBase::initializeLicensed(IUnknown **ptr)
创建 licensed 控件的实例,并将对象的 IUnknown 接口返回到 ptr 中。如果成功则返回 true,否则返回 false。
如果控制字符串包含子串 "}", 则该函数由 initialize() 调用。授权密钥必须跟在子串后面。
另请参阅initialize()。
[受保护的]
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().
[虚函数]
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。
[虚拟]
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等)。
© 2024 Qt公司有限公司。此处包含的文档贡献权归各自所有者所有。此处提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款许可。Qt及其相关标志是芬兰和/或其他国家的Qt公司注册的商标。所有其他商标均为各自所有者的财产。