在上一篇 Qt实现 CEF制作浏览器(首篇) 中,编译了cefsimple,打开了浏览器,不过该浏览器是demo做例子用的,但是我们的目的是为了嵌入qt窗口中。

本篇将介绍如何将CEF生成的浏览器嵌入到qt中窗口使用。

认为大家有一定基础,所以不再介绍如何在vs中加载licef_dll_wrapper等库和cef头文件等。

目录

一、准备步骤

二、运行效果

三、主要代码

四、完整代码和库:


一、准备步骤

1、编译licef_dll_wrapper库,记得如下把运行库改为多线程DLL(MD),debug下改为MDd。

2、把simple_handler.cc和simple_handler.h拷贝到自己的项目src里,直接使用

3、注释掉以下不需要的函数。

4、找到wWinMain,这是cef初始化的相关代码,拷贝到自己的cef初始化代码中。

二、运行效果

三、主要代码

1、main函数

int main(int argc, char *argv[])
{//初始化cefbool flag = CefManager::instance()->CefInit();if (!flag) {return -1;}QApplication a(argc, argv);QtCef w;w.show();int ret = a.exec();CefManager::instance()->CefQuit();return ret;
}

对CEF的初始化和退出放在了一个全局静态类中,比较方便去维护和复用,初始化为什么放在main函数之前?因为在我的软件,如果放在其他地方,会出现两个运行程序,目前原因还不清楚。

2、cef初始化代码

bool CefManager::CefInit()
{HINSTANCE hInstance = ::GetModuleHandle(NULL);// Enable High-DPI support on Windows 7 or newer.CefEnableHighDPISupport();void* sandbox_info = NULL;#if defined(CEF_USE_SANDBOX)// Manage the life span of the sandbox information object. This is necessary// for sandbox support on Windows. See cef_sandbox_win.h for complete details.CefScopedSandboxInfo scoped_sandbox;sandbox_info = scoped_sandbox.sandbox_info();
#endif// Provide CEF with command-line arguments.CefMainArgs main_args(hInstance);// CEF applications have multiple sub-processes (render, plugin, GPU, etc)// that share the same executable. This function checks the command-line and,// if this is a sub-process, executes the appropriate logic.int exit_code = CefExecuteProcess(main_args, NULL, sandbox_info);if (exit_code >= 0) {// The sub-process has completed so return here.return exit_code;}// Specify CEF global settings here.CefSettings settings;#if !defined(CEF_USE_SANDBOX)settings.no_sandbox = true;
#endifsettings.multi_threaded_message_loop = true;// SimpleApp implements application-level callbacks for the browser process.// It will create the first browser instance in OnContextInitialized() after// CEF has initialized.CefRefPtr<SimpleApp> app(new SimpleApp);// Initialize CEF.CefInitialize(main_args, settings, app.get(), sandbox_info);return true;
}

3、浏览器创建

bool QCefView::createCefBrowser()
{RECT rect;rect.left = 0;rect.top = 0;rect.right = qobject_cast<QWidget*>(this->parent())->width();rect.bottom = qobject_cast<QWidget*>(this->parent())->height();CefWindowInfo windowInfo;CefBrowserSettings browserSettings;windowInfo.SetAsChild(reinterpret_cast<HWND>(this->winId()), rect);CefBrowserHost::CreateBrowser(windowInfo, _browserHandler.get(),CefString(_url.toStdWString()), browserSettings, nullptr);qDebug() << "CreateBrowser success!" << _url;return true;
}

通过CreteBrowser()函数创建浏览器,CefWindowInfo对象的SetAsChild函数设置当前窗口的句柄ID为接下来浏览器的父窗口,从而实现内嵌CEF浏览器到Qt窗口中。

4、加载Url

void QCefView::loadUrl(const QString &url)
{if (url.isEmpty()) return;_url = url;qDebug() << "loadUrl" << _url;createCefBrowser();
}

这里直接传入QString字符串,然后调用创建浏览器的接口。

5、界面内嵌cef的父窗口

QtCef::QtCef(QWidget *parent): QWidget(parent)
{ui.setupUi(this);qDebug() << "QtCef Init";QVBoxLayout * vlayout = new QVBoxLayout;vlayout->setSpacing(0);vlayout->setMargin(0);_cefView = new QCefView(this);vlayout->addWidget(_cefView);this->setLayout(vlayout);_cefView->loadUrl("http://www.baidu.com");
}

通过addwidget将搭载cef浏览器的qt窗口添加到我们需要显示的界面上。

四、完整代码和库:

这只是一个简单的演示demo,功能并不完善,大家可以自行在此基础上进行拓展和完善。

如果有需要功能完善的代码和库的同学可以关注我的微信公众号 回复 CEF浏览器 领取源码:

Qt实现 内嵌CEF3制作浏览器(尾篇)相关推荐

  1. 在浏览器中内嵌word_关于项目浏览器内核的选取解读

    故事的开始 那天我刚刚开发好的桌面壁纸发现webkit浏览器内核虽然小 但是网页支持非常差于是我走访了一圈 整理了一堆浏览器内核 Cef 全民Chromium Embedded Framework ( ...

  2. 浏览器实战篇----浏览器安全概述

    浏览器安全概述 1. 揭秘浏览器 1.1 同源策略 1.2 HTTP首部 1.3 标记语言 HTML XML 1.4 CSS 1.5 脚本 JavaScript VBScript 1.6 DOM 1. ...

  3. PC游戏中用CEF3制作内嵌浏览器

    因为项目需要,需要将游戏手机助手中的朋友圈给移植到PC游戏中,而以前游戏中的内嵌浏览器采用的是IE6内核,满足不了我们的需求,于是决定把Cef3内嵌到游戏中,在完成正常工作之余,利用闲散时间不断地查找 ...

  4. QT应用程序-获取Application-获取主窗口指针-QT内嵌浏览器-QT菜单动作

    在编写QT程序时,有时需要获取主窗口程序指针和主窗口指针,方便控制界面,编写相应的逻辑,而QT则提供了类似的功能. 1.获取应用程序 qApp 宏就可以获取 QApplication 实例,只要使用了 ...

  5. unity内嵌浏览器——UniWebView插件

    这次突然被要求实现内嵌浏览器.在网上到处找资料参考,下面几个链接的内容感觉很实用 https://blog.csdn.net/qq_37310110/article/details/79761844 ...

  6. C++混合编程:QCefView、QWebKit,QWebengine、miniblink内嵌浏览器对比

       随着前端技术的发展,PC端程序越来越倾向于做第三方嵌入浏览器的应用程序.为什么手机软件安装包越来越大,大概率是由于偷偷嵌入了一个浏览器内核,例如:腾讯视频.虾米音乐等主流PC端程序都是内嵌浏览器 ...

  7. Java实现内嵌浏览器

    创建项目 ---->   导入需要的jar ---->  代码实现 需要的jar: https://pan.baidu.com/s/1MEZ1S0LnKSMGQm24QWgmCw 代码: ...

  8. IE内嵌google chrome frame解决浏览器兼容问题

    IE内嵌google chrome frame解决浏览器兼容问题 参考文章: (1)IE内嵌google chrome frame解决浏览器兼容问题 (2)https://www.cnblogs.co ...

  9. Android开发实用小技巧九——内嵌WebView的使用(内置浏览器)

    文章目录 前言 一.效果展示 二.代码 1.样式布局 2.活动页面 总结 前言 内嵌WebView的使用(内置浏览器). 一.效果展示 二.代码 1.样式布局 res/layout/activity_ ...

最新文章

  1. 单招考试计算机专业大概分数线是多少,单招分数线一般多少 单招分数怎样算...
  2. final在java中怎么用_Java中final的简单使用说明
  3. da---tlc5615._CD-DA的完整形式是什么?
  4. 模型秒变API只需一行代码,支持TensorFlow等框架
  5. leetcode 95 python
  6. PAID Network宣布已获币安DeFi加速器基金投资
  7. MySQL数据库与Oracle数据库在存储中文字符以字节或字符存储的区别
  8. vim 使用、设置笔记
  9. 理解频域、时域、FFT和加窗 加深对信号的认识
  10. 美术集网校—多点透视如何运用于绘画中?学会透视增加绘画体积感!
  11. C# 创建 Word 并另存为PDF格式
  12. CATIA二次开发开源项目—CATSearch
  13. python巡检网络设备_pyhton对网络设备的日常巡检
  14. 用微信公众号做淘宝优惠券查券和返利机器人的详细设置教程
  15. [HSI论文阅读] | SSRN:Spectral-Spatial residual network for HSI classification
  16. 英文会议口头报告(整理)
  17. 解决arcgis地图选中的时候有白色边框的问题
  18. Kali之Crunch:自定义字典
  19. Ubuntu下PDF文件转JPG图片
  20. require与import的区别和使用

热门文章

  1. JAVA学习(1天) #来源:异步图书
  2. 因以下文件的损坏或者丢失,Windows 无法启动实用解决方法
  3. burp跑字典,验证码破解4/6
  4. 【TFTP客户端--实现下载文件和上传文件】
  5. cutterman 截的图片出现文字乱码
  6. Java初学者作业——学生成绩等级流程图练习
  7. 数据结构-二叉链表存储的二叉树(利用先序遍历)
  8. 学成在线,全部流程图
  9. VMware Workstation 与 Device/Credential Guard 不兼容问题
  10. 如何设置ISIS中电源的值