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子类的成员。

CONFIG  += qaxcontainer

1. 妙用1 支持ActiveX对象

Qt直接支持ActiveX对象,所以在QT中可以直接使用QAxWidget,也就是窗口控件对象。例如word,excel,powerpoint,pdf,flash等。

对于doc,excel,ppt的文档格式可以直接将文件路径作为控件进行设置

QAxWidget->setControl(“E:/test.doc”);直接会加载word应用打开doc文档,其他的微软格式也是这样的。如果不是微软的标准格式的话,那么你需要从控件列表中进行选择,或则从控件的注册表中进行选择。
QString swfPath = qApp->applicationDirPath() + "/swf/player.swf";
widget = new QAxWidget(ui->widget);
widget->setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}"));//设置此属性会初始化COM对象。 先前设置的任何COM对象都将关闭。
widget->dynamicCall("LoadMovie(long,string)", 0, swfPath);

 

2. 妙用2 访问网页
#include "mainwindow.h"
#include <QApplication>
#include <QAxWidget>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QAxWidget* webWidget = new QAxWidget;
    //设置ActiveX控件为IEMicrosoft Web Browser
    //设置ActiveX控件的id,最有效的方式就是使用UUID
    //此处的{8856F961-340A-11D0-A96B-00C04FD705A2}就是Microsoft Web Browser控件的UUID
    webWidget->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}"));
    webWidget->setObjectName(QString::fromUtf8("webWidget"));//设置控件的名称
    webWidget->setFocusPolicy(Qt::StrongFocus);//设置控件接收键盘焦点的方式:鼠标单击、Tab键
    webWidget->setProperty("DisplayAlerts",false); //不显示任何警告信息。
    webWidget->setProperty("DisplayScrollBars",true); // 显示滚动条
    webWidget->show();
    QString sUrl = "https://map.baidu.com/@13523265.31,3641114.64,12z";
    webWidget->dynamicCall("Navigate(const QString&)",sUrl);
    return a.exec();
}

3. 远程桌面

  1. // ui->axWidget->setControl(QStringLiteral("{8b918b82-7985-4c24-89df-c33ad2bbfbcd}"));
  2. ui->axWidget->setProperty("Server","192.168.31.158"); // 远程连接 IP
  3. ui->axWidget->setProperty("UserName", "administrator"); // 用户名
  4. ui->axWidget->setProperty("ClearTextPassword", "123456"); // 用户密码
  5. ui->axWidget->setProperty("DesktopWidth", 800); // 指定宽度
  6. ui->axWidget->setProperty("DesktopHeight", 600); // 指定高度
  7. ui->axWidget->dynamicCall("Connect()"); // 连接


原文地址:https://www.cnblogs.com/lvdongjie/p/14664457.html