webenginewidgets源码_源码编译webenginewidgets - CSDN
精华内容
参与话题
  • 原文地址:点击打开链接背景:qt4到qt5.4一直采用qwebkit实现c++ js混合编程,到qt5.5之后引入了qwebenginewidgets和qwebchannel来代替qwebkit,从qt5.6之后开始,qwebkit就不再被支持了。Qt新版本使用...

    原文地址:点击打开链接

    背景:

    qt4到qt5.4一直采用qwebkit实现c++ js混合编程,到qt5.5之后引入了qwebenginewidgets和qwebchannel来代替qwebkit,从qt5.6之后开始,qwebkit就不再被支持了。

    Qt新版本使用QWebEngineView来展示html页面对QWebView不再进行维护了,QWebEngineView使用chromium内核将带来更好的用户体验。

    对QWebView感兴趣的可以参考:http://blog.csdn.net/tujiaw/article/details/50372892

    从QWebView到QWebEngineView,参考:http://blog.csdn.net/tujiaw/article/details/52075495

    • C++调用js很简单

      m_view->page()->runJavaScript("showAlert()");
      • 1
    • js调用C++函数

       QWebChannel *channel = new QWebChannel(this);
      channel->registerObject("bridge", (QObject*)bridge::instance());
      m_view->page()->setWebChannel(channel);
      • 1
      • 2
      • 3

    注意这个bridget类最好是从QObject继承,不要直接使用Dialog,否则你会看到一些莫名其妙的错误日志,而且使用一个中间类也可以解耦C++与js/html之间的逻辑

    源码如下,地址: 
    main.cpp

    #include "dialog.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Dialog w;
        w.show();
    
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    dialog.h

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    
    namespace Ui {
    class Dialog;
    }
    
    class QWebEngineView;
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
    
    private:
        Ui::Dialog *ui;
        QWebEngineView *m_view;
    };
    
    #endif // DIALOG_H
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    dialog.cpp

    #include "dialog.h"
    #include "ui_dialog.h"
    #include <QWebEngineView>
    #include <QWebChannel>
    #include <QDir>
    #include <QDebug>
    #include "bridge.h"
    
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    
        m_view = new QWebEngineView(this);
        QWebChannel *channel = new QWebChannel(this);
        channel->registerObject("bridge", (QObject*)bridge::instance());
        m_view->page()->setWebChannel(channel);
        m_view->page()->load(QUrl(QString("file:///%1/%2").arg(QApplication::applicationDirPath()).arg("index.html")));
    
        ui->viewLayout->addWidget(m_view);
        connect(ui->pbAlert, &QPushButton::clicked, [this]() {
            m_view->page()->runJavaScript("showAlert()");
        });
    }
    
    Dialog::~Dialog()
    {
        delete ui;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    bridge.h

    #ifndef BRIDGE_H
    #define BRIDGE_H
    
    #include <QObject>
    
    class bridge : QObject
    {
    Q_OBJECT
    public:
        static bridge* instance();
    
    public slots:
        void showMsgBox();
    
    private:
        bridge();
    };
    
    #endif // BRIDGE_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    bridge.cpp

    #include "bridge.h"
    #include <QMessageBox>
    
    bridge* bridge::instance()
    {
        static bridge s_obj;
        return &s_obj;
    }
    
    bridge::bridge()
    {
    }
    
    void bridge::showMsgBox()
    {
        QMessageBox::aboutQt(0, tr("Qt"));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    index.html

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>test</title>
        <script src="./qwebchannel.js"></script>
      </head>
      <body style="background:#282c34;">
        <h3 style="color:#ffffff;">this is web page</h3>
        <input type="button" value="C++ function callback" onclick="onShowMsgBox()">
        <script>
          new QWebChannel(qt.webChannelTransport, function(channel) {
            window.bridge = channel.objects.bridge;
          })
          function onShowMsgBox() {
            if (bridge) {
              bridge.showMsgBox()
            }
          }
    
          function showAlert() {
            alert('this is web alert');
          }
        </script>
      </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    qwebchannel.js是Qt提供的可以在这里下载:https://code.csdn.net/tujiaw/webengineview/tree/master/qwebchannel.js

    运行的时候index.html和qwebchannel.js这两个文件放在与exe同级目录下


    展开全文
  • 问题一:编译QWebEngineWidgets出现错误Project ERROR: Unknown module(s) in QT: webenginewidgets原因: 因为...方法一:源码编译webenginewidgets方法二:换成Visual studio编译环境,可以使用其静态库文件。 ...

    问题一:编译QWebEngineWidgets出现错误Project ERROR: Unknown module(s) in QT: webenginewidgets

    原因:    因为Qt默认没有安装“webenginewidgets”和“webengine”模块的软件包。

    方法一:源码编译webenginewidgets

    方法二:换成Visual studio编译环境,可以使用其静态库文件。


        再直接编译即可!

    ————————————————————————————————————————————————

    问题二:使用QtWebEngine开发的浏览器无法播放HTML5中的mp4文件?

    原因:   QtWebEngine 不带mp4解码器

    方向一:使Qt内嵌FlashPlay  

    方法二:添加mp4的解码器

                尝试添加mp4解码器。

                原理:利用QtWebEngine 和chrome使用的都是chromium 内核。QT借助Chrome的解码器。

                步骤如下:

                    1.下载安装一个chrome,其版本要与QtWebEngine的一致。

                  2.取Chrome安装目录下的ffmpegsumo.dll,将ffmpegsumo.dll放到QT的安装目录……\plugins\qtwebengine\下面。(当生成目标程序的时候,也将plugins\qtwebengine\ffmpegsumo.dll放到安装包内





    展开全文
  • 近期,因为同学所托,稍微涉足了一下并不熟悉的Web浏览器这一块。由于之前用过Qt Webkit,便准备动手试试看,能不能在网页中实现自动填表。 自动填表的实现方法挺多,有基于JS的,基于IE OLE的,还有直接模拟鼠标、...

    近期,因为同学所托,稍微涉足了一下并不熟悉的Web浏览器这一块。由于之前用过Qt Webkit,便准备动手试试看,能不能在网页中实现自动填表。

    自动填表的实现方法挺多,有基于JS的,基于IE OLE的,还有直接模拟鼠标、键盘操作的。论实现的简单程度,还是JS比较方便。之前QtWebkit中即可直接调用JS脚本,结果发现,Qt不知道什么时候,就把QWebKit从官方仓库中移出了。给的解释是“需要一个更现代、更高性能,最先进的Web浏览器实现”,于是,看中了谷歌的 chromium 。目前关于QWebEngine的系统文档还不是很多,

    一、QWebKit与QWebEngine的区别

    1. 模块结构

    这就使得实现诸如JS调用返回值这样的功能,QWebEngine需要的代码量显著多于QWebKit。我们把QWebEngine的架构示意图官网上直接贴来:

    (1)QtWebEngine模块结构

    模块中,Qt WebEngine Core是基于chromium的核心,widgets、WenEngine和 process主要分别针对桌面、QML等需求。
    WebEngine

    (2)桌面应用的类结构

    Desktop

    (3)QML的类结构

    QML

    2. 与WebKit主要区别

    区别项目 WebKit WebEngine
    调用习惯 同步 异步
    Html5兼容性 较差
    windows编译器兼容性

    (1) 同步vs异步

    最大的区别,莫过于使用的习惯了。QWebKit很多操作都是同步进行的,包括JS的调用、获得返回值等等。QWebEngine几乎所有的操作都是异步的。

    (2)Html5兼容性

    WebKit打开带有WebGL的3d CesiumJS 地理信息客户端时,性能显著低于 QWebEngine。在python tensorflow 对应的tensorboard监控状态页面表现差别更大。

    (3)编译器兼容性

    WebKit在windows下有mingw、vc++几个版本的预编译包。但是,要是使用QWebEngine,貌似暂时只能使用VisualStudio,且官方提供的是x64版本。从编译器兼容性来说,WebKit显然更好。

    二、调用方法

    1. 第一个WebEngine程序

    启动一个Web页面的方法很简单,与WebKit基本一致。

    #include <QApplication>
    #include <QWebEngineView>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWebEngineView * pv = new QWebEngineView();
        pv->setUrl(QUrl("http://www.baidu.com"));
        pv->show();
        return a.exec();
    }

    2. 打开一个调试页面

    我们可以通过简单的语句,直接开启开发者模式。

    #include <QApplication>
    #include <QWebEngineView>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWebEngineView * pdev = new QWebEngineView();
        pdev->show();
    
        QWebEngineView * pv = new QWebEngineView();
        pv->setUrl(QUrl("http://www.baidu.com"));
        pv->show();
        pv->page()->setDevToolsPage(pdev->page());
        return a.exec();
    }

    上述程序会直接开启开发者模式。在开发者模式下,可以运行JS脚本。
    开发者模式

    3. 详细范例:simplebrowser

    详细的范例可以参考官方的例子,simplebrowser。
    调用JS脚本可以直接运行

    view()->page()->runJavaScript("a = 12;");

    但若获取返回值,则是异步过程。

    page()->runJavaScript("document.title", [](const QVariant &v) { qDebug() << v.toString(); });

    更重要的是,似乎在页面没有加载完毕前,很多脚本无法正确运行。

    三、发布

    QWebKit与QWebEngine的发布都很麻烦,在windows下,都需要依赖 windeployqt.exe
    把自己的程序拷贝到一个空文件夹下,而后运行

    D:\TEST>windeployqt  firstWebEngine.exe

    会拷贝所有的文件到文件夹。

    Adding Qt5Svg for qsvgicon.dll
    Adding Qt5SerialPort for qtposition_serialnmea.dll
    ...
    Direct dependencies: Qt5Core Qt5Widgets Qt5WebEngineWidgets
    All dependencies   : Qt5Core Qt5Gui Qt5Network Qt5Positioning Qt5PrintSupport Qt5Qml Qt5Quick Qt5QuickWidgets Qt5Widgets Qt5WebEngineCore Qt5WebEngineWidgets Qt5WebChannel
    To be deployed     : Qt5Core Qt5Gui Qt5Network Qt5Positioning Qt5PrintSupport Qt5Qml Qt5Quick Qt5QuickWidgets Qt5SerialPort Qt5Svg Qt5Widgets Qt5WebEngineCore Qt5WebEngineWidgets Qt5WebChannel
    ...

    注意的是,QtWebEngine依赖一个单独的进程文件,QtWebEngineProcess.exe
    也需要再次运行一次

    D:\TEST>windeployqt  QtWebEngineProcess.exe

    确保依赖性。
    发布包总共高达162MB,还是非常的恐怖!

    展开全文
  • webenginewidgets

    2019-07-27 03:38:31
    QT += core gui webenginewidgets //窗口引擎部件//显示原码的dialog #ifndef DIALOG_H #define DIALOG_H #include <QDialog> namespace Ui { class Dialog; } class Dialog : public QDialog ...
    QT       += core gui  webenginewidgets  //窗口引擎部件
    //显示原码的dialog
    #ifndef DIALOG_H
    #define DIALOG_H
    
    
    #include <QDialog>
    
    
    namespace Ui {
    class Dialog;
    }
    
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
    
    
        void setWebSource(QString);  //给dialog设置文本
    
    
    private:
        Ui::Dialog *ui;
    };
    
    
    #endif // DIALOG_H
    #include "dialog.h"
    #include "ui_dialog.h"
    
    
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    }
    
    
    Dialog::~Dialog()
    {
        delete ui;
    }
    
    
    void Dialog::setWebSource(QString str)
    {

    //提供一个接口 把文本显示到dialog
        ui->textEdit->setText(str);
    }
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    
    #include <QMainWindow>
    #include <QWebEngineView>  //web 引擎
    #include <QUrl>  //url
    #include <QProgressBar>  //进度条
    #include <QFile> //加载配置文件
    #include <QTextStream> //文本流
    #include <QMessageBox>
    #include <QDebug>
    #include "dialog.h"
    
    
    namespace Ui {
    class MainWindow;
    }
    
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void setmainpage(); //设置默认主页
    
    
    private slots:
        void setUrlSlot(QUrl url);
        void deleteprogress(bool);
        void setTitle(QString);
        void setMainpageslot();
        void showcodeaction();//显示原码
    private:
        Ui::MainWindow *ui;
        QWebEngineView* m_webView;  //全局的
        QProgressBar *progress;
    };
    
    
    #endif // MAINWINDOW_H

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    //mainpage= http://www.baidu.com
    //QString mainpage="mainpoage=http://www.baidu.com"
    
    
    //QStingList list = mainpage.split("=");
    //list  = mainpage      http://www.baidu.com
    //ui.webView.lod(QUrl(list.at(1))); =http://www.baidu.com
    
    
    //配置文件   win .ini   linux .conf
    //在Debug 文件下  新建文件 mainpage.conf   在程序的运行目录
    //QML   qt  Mark lauguage  language  标记性语言  模块渲染界面
    // ui  用户界面  ux  用户体验
    //  qml
    /*
    注册表相当于一个数据库
    
    
    查看源代码 add 新文件  qt  ->  设计师类界面  dialog
    
    
    
    
     */
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        //创建QWebEngineView 对象
        this->
        m_webView = new QWebEngineView();
    
    
        //把webview 放入ui  ui的主窗口的布局添加窗口
       ui->centralWidget->layout()->addWidget(m_webView);
       
       setmainpage();
    //实例化进度条
       this->progress = new QProgressBar;
       //添加到状态栏
       ui->statusBar->addWidget(this->progress);
    
    
       //连接信号
        connect(ui->frowardButton, &QPushButton::clicked, this, [this]() {
           QString url = ui->lineEdit->text();
            if (!url.isEmpty())
            {
    
    
               m_webView->load(url);
            }
        });
        //连接webview 进度数据  到进度条
        connect(m_webView,SIGNAL(loadProgress(int)),this->progress,SLOT(setValue(int)));
    //连接entry信号
    connect(ui->lineEdit, &QLineEdit::returnPressed, this, [this]() {
           QString url = ui->lineEdit->text();
            if (!url.isEmpty())
            {
    
    
               m_webView->load(url);
            }
        });
    
    
    //调用Webview 的槽函数
        connect(ui->frowardButton,SIGNAL(clicked(bool)),m_webView,SLOT(forward()));
        connect(ui->back,SIGNAL(clicked(bool)),m_webView,SLOT(back()));
        connect(ui->refreshButton,SIGNAL(clicked(bool)),m_webView,SLOT(reload()));
        connect(m_webView,SIGNAL(urlChanged(QUrl)),this,SLOT(setUrlSlot(QUrl)));
        //连接webView 加载完成信号  删除进度条
    
    
    connect(m_webView,SIGNAL(loadFinished(bool)),this,SLOT(deleteprogress(bool)));
       //设置标题
    connect(m_webView,SIGNAL(titleChanged(QString)),this,SLOT(setTitle(QString)));
    //设置主页
    connect(ui->action_M,SIGNAL(triggered(bool)),this,SLOT(setMainpageslot()));
    connect(ui->action_S,SIGNAL(triggered(bool)),this,SLOT(showcodeaction()));
    
    
    }
    
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::setmainpage()
    {
        QString filename = "mainpage.conf";  //文件路径
        QFile *file = new QFile;  //文件对象
        file->setFileName(filename); //设置文件名
        bool ok = file->open(QIODevice::ReadOnly); //打开方式
        QTextStream in(file);
        if(ok)
            {
            //把内容读入 输入框
            m_webView->load(QUrl(in.readLine().split("=").at(1)));
        file->close();
        delete file;
        file = NULL;
    
    
        }else
            {
    
    
            QMessageBox::information(this,"Error Message","openfile Error"+file->errorString());
        }
    
    
    }
    //获取地址
    void MainWindow::setUrlSlot(QUrl url)
    {
        ui->lineEdit->setText(url.toString());
    
    
    }
    //删除进度条
    void MainWindow::deleteprogress(bool ok)
    {
        if(ok)
            {
    
    
            delete this->progress;
            this->progress = NULL;
          this->ui->statusBar->showMessage("Load finish",5*1000);
        }
    }
    
    
    void MainWindow::setTitle(QString title)
    {
        this->setWindowTitle(title);
    }
    
    
    void MainWindow::setMainpageslot()
    {
        QString filename = "mainpage.conf";  //文件路径
        QFile *file = new QFile;  //文件对象
        file->setFileName(filename); //设置文件名
        bool ok = file->open(QIODevice::WriteOnly); //打开方式
    
    
        if(ok)
            {
             QTextStream out(file);
            //把内容读入 输入框
     out<<"mainpage="+ui->lineEdit->text();
        file->close();
        delete file;
        file = NULL;
        QMessageBox::information(this,"Information","setmain page sucess");
    
    
        }else
            {
            qDebug()<<"set mainpage error";
    
    
            QMessageBox::information(this,"Error Message","openfile Error"+file->errorString());
        }
    }
    //查看原代码   没有实现
    void MainWindow::showcodeaction()
    {
    
    
        QString content=m_webView->page()->selectedText();
        Dialog *dialg=new Dialog;//Dialog
        dialg->setWebSource(content);
        dialg->show();
    }
    
    
    
    




    转载于:https://www.cnblogs.com/countryboy666/p/11071647.html

    展开全文
  • mingW编译器不支持webenginewidgets模块

    千次阅读 2017-09-13 09:18:09
    Qt5.4以后,webkit就改为了webengine。 而webengine只支持msvc,不支持mingW。原因是Qt官方已经放弃了mingW,理由是chrome团队不喜欢mingw。既然谷歌放弃了mingW,那我们也没必要那么坚持。 以下是截取网友的一些...
  • *.pro中: DEFINES += _qt_msvc_2015 contains(DEFINES,_qt_msvc_2015){ QT += webengine QT += webenginewidgets }else{ message("static release version : webengine webenginewidgets
  • Qt Webengine Widget常见问题

    千次阅读 2018-09-03 11:46:45
    原文地址::...   相关文章 1、Qt5.x 编译QWebenginewidgets出现错误Project ERROR: Unknown module(s) in QT: webenginewidgets----https://blog.csdn.net/lisen9lisen/ar...
  • Qt5.11的QWebEngine编译

    千次阅读 2018-10-25 15:16:55
    Qt5.11的QWebEngine编译 准备工具 VS版本:VS2017; ...Python版本:Python2.7.5或以上版本,不支持Python 3版本;...Qt5.11版本安装包,MSVC 2015 32-bit、MSVC 2015 64-bit、MSVC 2017 64-bit、Sources模块;...
  • Qt WebEngine版本要求

    千次阅读 2018-01-12 14:42:54
    WebEngine是Qt5.4之后加入的新特性,用Qt WebEngine取代之前的Qt Webkit ... windows版本 windows版本需要vs2013支持,下面是官方文档的原话: Building on Windows currently requires Visual Studio 2013 or Visual...
  • QT5 地图开发步骤

    万次阅读 2017-04-16 17:23:51
    QT += webengine webenginewidgets 2. 在*.ui中添加Widget named widget_web,并升级为QWebEngineView 3. 在程序代码中添加 ui->widget_web->setUrl(QUrl(spath));// spath为地址 编译运行程序,效果如下:
  • Qt之QWebEngineView用法总结

    千次阅读 2018-05-24 20:17:31
    一、开发环境Qt5.6.2+VS2015 二、向项目中添加相应模块[cpp] view plain copy QT += webenginewidgets 三、打开网页插件支持[cpp] view plain copy m_webview-&gt;settings()-&gt;setAttribute...
  • from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView app = QApplication(sys.argv) browser = QWebEngineView() browser.load(QUrl("http://news.baidu.com/?tn=news")) browser.show() app.exec...
  • ![这是浏览器中使用检查,看到的源代码,也就是我想要获得的源代码](https://img-ask.csdn.net/upload/201608/22/1471849903_877435.png) ![这是通过查看网页源代码所看到的,目前拿到的是这个]...
  • debian下为QT安装QWebEngine

    千次阅读 2018-06-05 14:57:11
    在debian上通过源码编译方式安装Qt,默认不安装QWebEngine。根据度娘提供的信息,在windows下只有vs版本才安装。参考这篇文章进行编译https://wiki.qt.io/QtWebEngine/How_to_Try首先安装依赖库。sudo apt-get ...
  • 我用PyQt5的QtWebEngineWidgets类做了一个简易的浏览器,它用的是chrome内核,可以浏览加载网页。下一步我要做的是模拟用户操作浏览器(点击,获取页面元素等等),用selenium工具实现。我找了很多selenium的使用...
  • 程序中使用了QtWebEngineWidgets.QWebEngineView,使用pyinstall -c -p D:xxx\xxx xxx.py打包后,打包过程正常,但是程序运行后,在使用到QWebEngineView的时候,程序崩溃,控制台提示:Could not find ...
  • ubuntu下配置qt creator,最后可以使用loongson的gcc编译可用于龙芯平台上的二进制文件。
  • 刁肥宅自己编译的Qt 5.7.0的静态编译库,亲测用这个库编译的exe程序,不需要任何dll和其他附加文件便可以在不带Qt环境的电脑上运行。
  • Windows下使用VS2013编译Qt5.6源码

    千次阅读 2017-02-27 20:27:09
    用过Qt的QHBoxLayout,QVBoxLayout再看flex布局有很多相似之处,特别要注意的是flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto,后面两个是可以省略的。当一个容器没有显示出来时要注意它...
1 2 3 4 5
收藏数 87
精华内容 34
关键字:

webenginewidgets源码