QT6中QAxWidget功能与用法
一.概述
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)接口可能存在差异,需测试兼容性。