QT调用IE浏览器COM插件完成网页浏览

2022-01-12 13:45:43 浏览数 (1)

一、可用的嵌入式浏览器方案

QT在5.6之前可以webkit浏览器框架访问网页,在之后就去掉了webkit,加入了QWebEngineView框架,但是QWebEngineView只能支持VS编译器,mingw编译器不支持。 在后面的高版本QT里,mingw编译器如果要加载网页可以使用两种方式。

(1). 编译webkit源码,使用webkit。 也可以不用自己编译,GitHub上可以下载编译好的库,直接下载使用即可。

下载地址: https://github.com/qtwebkit/qtwebkit/releases/tag/qtwebkit-5.212.0-alpha4

(2). 使用IE浏览器的COM插件,这个比较简单,也比较方便,就是IE浏览器目前不维护了。

本篇文章就介绍如何使用IE的COM插件完成网页浏览。分别都支持VS和MinGW编译器。

二、实现方法

2.1 加载IE浏览器的COM组件

打开UI设计界面,拖入一个axWidget控件,加载IE浏览器插件(Internet Explorer)。

右键选择转到槽,弹出菜单,可用选择需要使用的信号。

我这里就关联了两个信号,一个标题加载完成,一个是加载进度。

代码语言:javascript复制
void axWidget_TitleChange(const QString &Text);

void axWidget_ProgressChange(int Progress, int ProgressMax);

最终实现的效果是,调用百度搜索指定的内容:

如果打开网页报错–脚本错误-JS加载错误之类的,需要设置IE浏览器的Intel安全设置,把活动脚本禁用即可。

(win10)按下win键,弹出左边的选项栏,找到windows附件,打开IE浏览器。

2.2 widget.cpp

代码语言:javascript复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //导出支持调用的函数接口
    QString DOC = ui->axWidget->generateDocumentation();
    QFile outFile("com_function.html");
    outFile.open(QIODevice ::ReadWrite|QIODevice ::Text);
    QTextStream TS(&outFile);
    TS<<DOC<<endl;

    this->setWindowTitle("单词翻译");

}


Widget::~Widget()
{
    delete ui;
}


/*
工程: COM_InternetExplorer_Test
日期: 2021-10-29
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 加载完成
*/
void Widget::on_axWidget_TitleChange(const QString &Text)
{
    qDebug()<<"Text:"<<Text;
}

/*
工程: COM_InternetExplorer_Test
日期: 2021-10-29
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 加载进度改变
*/
void Widget::on_axWidget_ProgressChange(int Progress, int ProgressMax)
{
    qDebug()<<QString("%1:%2").arg(ProgressMax).arg(Progress);
}


void Widget::on_pushButton_clicked()
{
    QString url;
    url="https://www.baidu.com/s?ie=UTF-8&wd=" ui->lineEdit->text();
    QVariantList params ={url,0,"","",""};
    ui->axWidget->dynamicCall("Navigate2(QString, QVariant&, QVariant&, QVariant&, QVariant&)", params);
}

2.3 widget.h

代码语言:javascript复制
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QAxWidget>
#include <QDebug>
#include <QFile>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_axWidget_TitleChange(const QString &Text);

    void on_axWidget_ProgressChange(int Progress, int ProgressMax);

    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

2.4 xxx.pro文件

代码语言:javascript复制
QT        = core gui
QT        = axcontainer
greaterThan(QT_MAJOR_VERSION, 4): QT  = widgets

CONFIG  = c  11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES  = QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES  = QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES  = 
    main.cpp 
    widget.cpp

HEADERS  = 
    widget.h

FORMS  = 
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS  = target

0 人点赞