相关文章推荐
苦恼的鸡蛋面  ·  Svelte ...·  2 月前    · 
英姿勃勃的课本  ·  Bootstrap ...·  1 年前    · 
大鼻子的鸵鸟  ·  C# ...·  2 年前    · 
  1. vs2013中的Qt5插件从Qt Project Settings中没有能引入QWebEngineView和QWebChannel的模块,我们可以在vs2013中手动加入。
  2. 附加包含目录: ( Q T D I R ) \include \QtWebEngineWidgets (QTDIR)\include\QtWebChannel
    附加依赖项:Qt5WebEngineWidgetsd.lib, Qt5WebChanneld.lib
  3. page()->mainFrame()->evaluateJavaScript(str);
    => page()->runJavaScript(str);
  4. QWebSettings
    => QWebEngineSettings
  5. QWebHistory
    => QWebEngineHistory
  6. page()->mainFrame()->load
    => page()->load
  7. Incorrect warning MSB8027 reported for files excluded from build

    vs2013更新到update5,或者
    文本编辑器打开project插入: IgnoreWarnCompileDuplicatedFilename


    true

  8. evaluateJavaScript
    => runJavaScript

  9. evaluateJavaScript返回值
    => 使用异步回调接受[](const QVariant &val) { }
  10. 设置QWebEngineView背景色
    => page()->setBackgroundColor(QColor(“#0f0f10”));

  11. Qt WebEngine ICU data not found The application MAY NOT work. Installed Qt WebEngine locales directory not found at location
    => 增加resources和translations目录,具体放的位置可以看日志哪里可以找到它,可以通过qt.conf文件来配置所在路径

  12. QWebEngineView调试

    方法1:html中加入 https://getfirebug.com/firebug-lite.js , 在页面上按F12打开调试面板
    缺点:这个js文件比较大,载入的时候影响效率;功能有限;
    方法2:在程序开始的时候qputenv(“QTWEBENGINE_REMOTE_DEBUGGING”, 9000),之后在chrome中打开网址:localhost:9000
    就可以看到QWebEngineView加载的html了,点击相应的html可以打开chrome的开发者工具;
    这个方法比上面的好得多。

  13. linkClicked(QUrl)
    重载QWebEnginePage实现acceptNavigationRequest接口

bool WebPage::acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame)
    if (isMainFrame) {
        if (NavigationTypeLinkClicked == type) {
            emit sigLoadUrl(url);
            return false;
    return true;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 同步返回runJavaScript结果,谨慎使用
QPair<bool, QVariant> syncRunJavaScript(QWebEnginePage *page, const QString &javascript, int msec) 
     QPair<bool, QVariant> result = qMakePair(false, 0);
     QSharedPointer<QEventLoop> loop = QSharedPointer<QEventLoop>(new QEventLoop());
     QTimer::singleShot(msec, loop.data(), &QEventLoop::quit);
     page->runJavaScript(javascript, [loop, &result](const QVariant &val) {
         if (loop->isRunning()) {
             result.first = true;
             result.second = val;
             loop->quit();
     loop->exec();
     return result;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在QWebEngineView重载函数contextMenuEvent中不能调用!
runJavaScript回调中不能进行长时间的操作,否则会阻塞JavaScript代码执行,如:

page()->runJavaScript("script", [](const QVariant &val) {
    // ...
    menu.exec(QCursor::pos());
 
  • 1
  • 2
  • 3
  • 4

解决办法,定义信号和槽函数,使用QueuedConnection的方式connect,在slotJavaScriptResult中处理耗时操作。

connect(this, &webview::sigJavaScriptResult, this, &webview::slotJavaScriptResult, Qt::QueuedConnection);
void sigJavaScriptResult(const QString &command, const QVariantMap &result);
void slotJavaScriptResult(const QString &command, const QVariantMap &result);
 
  • 1
  • 2
  • 3
  1. runJavaScript时机
connect(this->page(), SIGNAL(loadFinished(bool)), this, SLOT(finish(bool)));
  1. js调用C++时机
window.cppobj = null;
new QWebChannel(qt.webChannelTransport, function(channel) {
  window.cppobj = channel.objects.cppobj;
  cppobj.init(); // 通知C++初始化完成
 
  • 1
  • 2
  • 3
  • 4
  • 5
  1. web页面,右键鼠标点击的元素

    function contextMenu(e) {
    var targ;
    if (!e) {
    var e = window.event;
    if (e.target) {
    targ = e.target;
    } else if (e.srcElement) {
    targ = e.srcElement;
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  2. web页面,获取选中的html
 function




    
 getHTMLOfSelection () {
  var range;
  if (document.selection && document.selection.createRange) {
    range = document.selection.createRange();
    return range.htmlText;
  else if (window.getSelection) {
    var selection = window.getSelection();
    if (selection.rangeCount > 0) {
      range = selection.getRangeAt(0);
      var clonedSelection = range.cloneContents();
      var div = document.createElement('div');
      div.appendChild(clonedSelection);
      return div.innerHTML;
    else {
      return '';
  else {
    return '';
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. QWebEngineView接收drop事件
之前setAcceptDrops(true);就可以了,现在还需要:
void webview::dragEnterEvent(QDragEnterEvent *event)
    event->accept();
    QWebEngineView::dragEnterEvent(event);
才能触发void webview::dropEvent(QDropEvent * event)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. web打印日志 
    重载QWebEnginePage中的javaScriptConsoleMessage函数很有用,可以接收到js打印的日志(如:console.log);
  2. 一个QWebEnginePage对应一个QtWebEngineProcess.exe进程,所以当web页窗口不显示的时候最好是销毁掉,不要隐藏;
  3. 某些机器上QWebEngineView内容显示不出来可能跟设置背景色有关;
  4. js与c++之间互调返回值处理 
    QWebEngineView中c++调用js代码是通过异步回调的方式获取的; 
    js调用c++的函数并不能获取c++函数的返回值,可以通过c++发送一个信号给js来返回。
原文: http://blog.csdn.net/tujiaw/article/details/52075495
下面是QT依赖的所有的库,构建运行过程中缺少哪一个库,找到后执行sudo apt-get install+库。1、Qt的媒体模块(Qt += multimedia)缺少模块multimedia的问题。比如Qt显示缺少serialbus库,搜索相关库,找到四个,全部安装。...... 公司一款产品的客户端使用了c/s、b/s混合模式,其中在线媒体浏览使用Html5的多媒体支持特性实现。然后,问题出来了:Qt自带的Webengine版本(Qt 5.6)不支持.mp4格式的多媒体文件,只能在线播放ogg。编译使用了visual studio 2015。 【编译参考】 linux:https://wiki.qt.io/How_to_Try_QtWebEngine windo 该例子支持Windows和Linux双系统实现,基于QT 5.14.2版本。Windows下安装webkit库,将下载的该压缩包拷贝至QT目录。qwebchannel.js脚本请从下方文章复制下。 解决方案: 在vc目录下找到vcredist_x64.exe(找自己对应版本),安装(考虑把运行时库同时发布到程序目录或者制作安装程序,同时安装vcredist_x64.exe),重启之后不再报缺少VC运行时库。 接着运行程序挂掉了,提示挂在了Qt5WebEngineCore.dll中,... zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 使用root用户报错 Could not find QtWebEngineProcess 详细的报错还有一个relocation error,然后指向的位置是用户目录下的 /home/用户 首先声明,本文并非原创,纯属搬运,内容来自一位叫做飞扬青春的大神的Gitee主页,主要是为了收藏下面介绍的100多个Qt开发经验。比如qss的ANSI编码、嵌套窗口中主窗口无法接收鼠标移动事件等,又比如我用qss设置窗口样式,但是项目每次重新构建以后,样式表就会不生效等问题,也花了自己不少时间去解决,所以在这里转发大神的经验,留作以后参考和逐条的研究,也分享给更多正在学习Qt或者正在使用Qt进行程序开发的朋友们。(点这下载最新版Qt) 1. 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着 实际上由于我的电脑可以上网,并且源中就有qt,所以执行命令 sudo apt -y updatesudo apt -y install qtcreator qt5-default qtdeclarative5-dev build-essential g++ cmake