一.概述

1.简介

 在 Qt 中,QAxWidget 是专门用于与 ActiveX 控件 交互的核心类,属于 Qt 的 ActiveX 模块(axcontainer)。它的主要作用是在 Qt 应用程序中嵌入和操控 Windows 平台特有的 ActiveX 组件,实现与 Office 软件(如 Word、Excel)、浏览器控件、多媒体播放器等 Windows 原生组件的集成。

2.核心作用

ActiveX 是 Windows 平台的一种组件对象模型(COM)技术,许多 Windows 应用(如 Microsoft Office、IE 浏览器)会提供 ActiveX 接口供外部程序调用。

QAxWidget 作为 Qt 与 ActiveX 的 “桥梁”,主要功能包括:

嵌入 ActiveX 控件到 Qt 界面中(如在 Qt 窗口中显示 Excel 表格、网页);

调用 ActiveX 控件的方法(如让 Excel 执行保存、打印操作);

访问和修改 ActiveX 控件的属性(如设置 Excel 单元格的值);

接收 ActiveX 控件触发的事件(如 Excel 单元格内容变化时通知 Qt 程序)。

二.代码示例

1.环境配置

使用 QAxWidget 需满足以下条件:

平台限制:仅支持 Windows 系统(ActiveX 是 Windows 特有技术);

模块依赖:在 Qt 项目文件(.pro)中添加 axcontainer 模块:

QT += axcontainer  # 启用 ActiveX 相关类

控件注册:需要使用的 ActiveX 控件必须已在系统中注册(通常安装对应软件后会自动注册,如安装 Office 后会注册 Excel 的 ActiveX 控件)。

2.创建并加载 IE 浏览器控件

#include <QAxWidget>

#include <QWidget>

// 在 Qt 窗口中嵌入网页浏览器

QWidget *parentWidget = new QWidget();

QAxWidget *webBrowser = new QAxWidget(parentWidget);

// 加载 IE 浏览器 ActiveX 控件(ProgID: "Shell.Explorer")

bool loaded = webBrowser->setControl("Shell.Explorer");

if (!loaded) {

    // 加载失败(可能控件未注册)

    qWarning() << "无法加载浏览器控件!";

    return;

}

// 设置控件大小并显示

webBrowser->setGeometry(0, 0, 800, 600);

parentWidget->show();

// 导航到指定网页

webBrowser->dynamicCall("Navigate(const QString&)", "https://www.baidu.com");

3.操控 Excel 控件

#include <QAxWidget>

#include <QVariant>

// 创建 Excel 控件

QAxWidget *excel = new QAxWidget();

excel->setControl("Excel.Application");  // 加载 Excel ActiveX 控件

// 设置 Excel 可见(默认不可见)

excel->setProperty("Visible", true);  // 调用属性设置

// 获取工作簿集合(Workbooks)

QAxObject *workbooks = excel->querySubObject("Workbooks");

// 新建一个工作簿(调用 Workbooks.Add() 方法)

workbooks->dynamicCall("Add()");

// 获取当前活动工作表(Worksheet)

QAxObject *worksheet = excel->querySubObject("ActiveSheet");

// 设置单元格内容(如 A1 单元格设为 "Hello Qt")

QAxObject *cell = worksheet->querySubObject("Cells(int, int)", 1, 1);  // Cells(行, 列)

cell->dynamicCall("SetValue(const QVariant&)", "Hello Qt");

// 保存工作簿(调用 SaveAs 方法,参数为保存路径)

QString savePath = "C:/test.xlsx";

worksheet->querySubObject("Parent")->dynamicCall(

    "SaveAs(const QString&)",

    QVariant(savePath)

);

// 清理资源

delete cell;

delete worksheet;

delete workbooks;

// 关闭 Excel(可选)

// excel->dynamicCall("Quit()");

// delete excel;

三.注意事项

平台限制:QAxWidget 仅在 Windows 平台有效,Linux/macOS 不支持 ActiveX 技术。

控件依赖:需确保目标系统已安装并注册所需的 ActiveX 控件(如使用 Excel 控件需安装 Microsoft Office)。

线程安全:ActiveX 控件通常不支持多线程调用,需在主线程中操作 QAxWidget。

版本兼容:不同版本的 ActiveX 控件(如 Office 2016 与 Office 2021)接口可能存在差异,需测试兼容性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐