一、可用的嵌入式浏览器方案
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)。
右键选择转到槽,弹出菜单,可用选择需要使用的信号。
我这里就关联了两个信号,一个标题加载完成,一个是加载进度。
void axWidget_TitleChange(const QString &Text);
void axWidget_ProgressChange(int Progress, int ProgressMax);
最终实现的效果是,调用百度搜索指定的内容:
如果打开网页报错–脚本错误-JS加载错误之类的,需要设置IE浏览器的Intel安全设置,把活动脚本禁用即可。
(win10)按下win键,弹出左边的选项栏,找到windows附件,打开IE浏览器。
2.2 widget.cpp
#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
#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文件
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