Qt ActiveX常用类及数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wyy626562203/article/details/82751247

Qt ActiveX常用类及数据类型

Qt 5.10.1

QAxBase

QAxBase类是一个抽象类,它提供用于初始化和访问COM对象的API。
QAxBase是一个不能直接使用的抽象类,它通过子类QAxObjectQAxWidget实例化。 此类提供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子类的成员。

扫描二维码关注公众号,回复: 3361336 查看本文章

QAxWidget

QAxWidget类是一个包装ActiveX控件的QWidget
QAxWidget可以实例化为空对象,它应该包含ActiveX控件的名称,或者使用指向ActiveX控件的现有接口指针。仅使用QAxBase支持的数据类型的ActiveX控件的属性,方法和事件可用作Qt属性,槽和信号。基类QAxBase提供了一个API,可以通过IUnknown指针直接访问ActiveX。
QAxWidget是一个QWidget,大部分都可以这样使用,例如它可以在窗口层次结构和布局中使用,也可以充当事件过滤器。标准小部件属性,例如支持启用,但它依赖于ActiveX控件来实现对环境属性的支持,例如调色板或字体。QAxWidget尝试提供必要的提示。
但是,您无法重新实现特定于Qt的事件处理程序,如mousePressEventkeyPressEvent,并期望可靠地调用它们。嵌入式控件完全覆盖了QAxWidget,通常处理用户界面本身。使用特定于控件的API(即监听控件的信号),或使用标准的COM技术,如窗口过程子类。
QAxWidget还从QAxBase继承了大部分与ActiveX相关的功能,特别是dynamicCall()querySubObject()
警告:您可以继承QAxWidget,但不能在子类中使用Q_OBJECT宏(生成的moc文件将无法编译),因此您无法添加更多信号,插槽或属性。此限制是由运行时生成的元对象信息引起的。要解决此问题,请将QAxWidget设置为QObject子类的成员。

猜你喜欢

转载自blog.csdn.net/wyy626562203/article/details/82751247