Qt ActiveX常用类及数据类型
Qt 5.10.1
QAxBase
QAxBase
类是一个抽象类,它提供用于初始化和访问COM对象的API。
QAxBase
是一个不能直接使用的抽象类,它通过子类QAxObject
和QAxWidget
实例化。 此类提供API以通过其IUnknown
实现直接访问COM对象。 如果COM对象实现了IDispatch
接口,则该对象的属性和方法可用作Qt属性和槽。
connect(buttonBack, SIGNAL(clicked()), webBrowser, SLOT(GoBack()));
对象的IDispatch
实现公开的属性可以通过Qt对象模型提供的属性系统读取和写入(两个子类都是QObjects
,因此可以使用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数据类型列在下表的第一列中。 第二列是Qt类型,可以与QObject
属性函数一起使用。 第三列是Qt类型,用于生成信号的原型和槽内参数,最后一列是Qt类型,用于信号原型和插槽用于输出参数。
COM type | Qt property | in-parameter | out-parameter |
---|---|---|---|
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 | type-dependent | const QVariant& | QVariant& |
IFontDisp* | QFont | const QFont& | QFont& |
IPictureDisp* | QPixmap | const QPixmap& | QPixmap& |
IDispatch* | QAxObject* | QAxBase::asVariant() | QAxObject* (return value) |
IUnknown* | QAxObject* | QAxBase::asVariant() | QAxObject* (return value) |
SCODE, DECIMAL | unsupported | unsupported | unsupported |
VARIANT* (Since Qt 4.5) | unsupported | 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
必须作为QVariants
参数列表中的元素提供。
如果需要访问属性或传递不支持的数据类型的参数,则必须通过其IDispatch
实现或其他接口直接访问COM对象。 可以通过queryInterface()
检索这些接口。
IUnknown *iface = 0;
activeX->queryInterface(IID_IUnknown, (void**)&iface);
if (iface) {
// use the interface
iface->Release();
}
要获得COM接口的定义,您必须为要使用的组件提供头文件。 一些编译器也可以使用#import
编译器指令导入类型库。 请参阅组件文档以了解您必须导入哪些类型库以及如何使用它们。
如果需要对传递不受支持的数据类型参数的事件做出反应,则可以使用提供COM事件提供的事件数据的通用信号。
QAxObject
QAxObject
类提供了一个包装COM对象的QObject
。
QAxObject
可以实例化为空对象,它应该包装它应该包含的COM对象的名称,或者指向表示现有COM对象的IUnknown
的指针。如果COM对象实现IDispatch
接口,则该对象的属性,方法和事件可用作Qt属性,槽和信号。基类QAxBase
提供了一个API,可以直接通过IUnknown
指针访问COM对象。
QAxObject
是一个QObject
,可以这样使用,例如它可以在对象层次结构中组织,接收事件并连接到信号和槽。
QAxObject
还从QAxBase
继承了大部分与ActiveX相关的功能,特别是dynamicCall()
和querySubObject()
。
警告:您可以子类化QAxObject
,但不能在子类中使用Q_OBJECT
宏(生成的moc文件将无法编译),因此您无法添加更多信号,槽或属性。此限制是由运行时生成的元对象信息引起的。要解决此问题,请将QAxObject
设置为QObject
子类的成员。
QAxWidget
QAxWidget
类是一个包装ActiveX控件的QWidget
。
QAxWidget
可以实例化为空对象,它应该包含ActiveX控件的名称,或者使用指向ActiveX控件的现有接口指针。仅使用QAxBase
支持的数据类型的ActiveX控件的属性,方法和事件可用作Qt属性,槽和信号。基类QAxBase提供了一个API,可以通过IUnknown
指针直接访问ActiveX。
QAxWidget
是一个QWidget
,大部分都可以这样使用,例如它可以在窗口层次结构和布局中使用,也可以充当事件过滤器。标准小部件属性,例如支持启用,但它依赖于ActiveX控件来实现对环境属性的支持,例如调色板或字体。QAxWidget
尝试提供必要的提示。
但是,您无法重新实现特定于Qt的事件处理程序,如mousePressEvent
或keyPressEvent
,并期望可靠地调用它们。嵌入式控件完全覆盖了QAxWidget,通常处理用户界面本身。使用特定于控件的API(即监听控件的信号),或使用标准的COM技术,如窗口过程子类。
QAxWidget
还从QAxBase
继承了大部分与ActiveX相关的功能,特别是dynamicCall()
和querySubObject()
。
警告:您可以继承QAxWidget
,但不能在子类中使用Q_OBJECT
宏(生成的moc文件将无法编译),因此您无法添加更多信号,插槽或属性。此限制是由运行时生成的元对象信息引起的。要解决此问题,请将QAxWidget设置为QObject子类的成员。