在上一篇 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. Java线程池示例:并行计算200000以内的质数个数
  2. 云栖大会极客智造局亮点抢先看
  3. H.264入门级概念之I、B、P帧
  4. c语言指针如何增加内存大小,C语言如何给指针分配内存?
  5. pytorch张量操作基础
  6. .net remoting的事务传播以及wcf分布式事务
  7. tensorflow一维卷积输入_深度学习中的反卷积(Transposed Convolution)
  8. EasyRecovery如何恢复系统镜像
  9. ubuntu 安装node.js
  10. 微信小程序反编译工具及方法
  11. C#逆向反编译工具:JetBrains dotPeek
  12. 图像识别没你想的那么难!看完这篇你也能成专家
  13. 测试管理工具【禅道】使用详解
  14. Hi3861网络通信——UDP收发
  15. 杨辉三角形延伸(菱形)
  16. addon游戏_MOD Herobrine Addon
  17. 【论文阅读】查询搜索中的安全和效率权衡(ACM 10.1145)
  18. oj 中G++和C++区别
  19. 商业模式画布的介绍例子
  20. Aspose.PDF for Java系列5-转化PDF文档为Word

热门文章

  1. JAVA之实现小项目——斗地主(随机发牌)
  2. 人脸信息检测易语言代码
  3. 如何保存自己喜欢的好看视频的方法及步骤
  4. AcWing-822. 走方格(排列组合)
  5. Linux内核学习之Linux内核“源码目录”
  6. ThinkPHP5企业新闻管理系统
  7. 高数下册作业题目及答案
  8. iOS不能下载迅雷怎么办
  9. 树莓派学习笔记——wiringPi I2C设备使用详解
  10. Python超详细基础教程,从入门到实践