給Qt內嵌一個Chrome吧
CEF(Chromium Embedded Framework),是一個用於開發Web瀏覽器控件的開源項目,其基於Google Chromium。php
參考
- CEF:給客戶端內嵌一個Chrome吧
- 理解WebKit和Chromium: Content API和CEF3
- CEF3筆記
- CEF中文教程
環境準備
Qt環境
下載,依次安裝,嘗試創建個Qt工程,運行ok便可。詳見參考2。css
CEF環境
運行配置,詳見參考3。不過,我並無安裝 Jun10 DX SDK 。html
- 安裝 VS10 SP1 ,是由於先前安裝了VS2012,編譯cefclient時,遇到了 'LINK : fatal error LNK1123' 的問題,詳見參考4。
- 安裝 Win8 SDK ,'..\Windows Kits\8.0\Include\winrt\asyncinfo.h' 66行的 class 須要註釋掉,參考3內有詳細描述。(不安裝,應該也能編譯發佈版的cef)
參考
- Visual Studio各版本下載合集
- QT4.8.5+qt-vs-addin-1.1.11+VS2010安裝配置和QT工程的新建和加載
- Build Instructions (Windows)
- LINK : fatal error LNK1123
CEF編譯
源碼
cef3主分支源碼,能夠用TortoiseSVN來獲取。不過,我用的是後一個發佈版本。更多可見CEF Downloads。git
解壓cef_xxx.7z,打開cefclient2010.sln,F5編譯運行。github
CEF for Qt
QMake編譯
qmake來編譯cef代碼。這裏新建Qt工程,再將cef代碼移過來,進行工程配置。基本步驟以下:web
- 新建Qt工程cefclient,Solution爲'qcef'。
- 右鍵Solution,追加libcef_dll的Qt static lib工程。
- 右鍵Solution > Properties > Common > Dependencies,cefclient depends on libcef_dll。
- 配置工程的各輸出目錄,可修改配置有:
- Project > Properties > Configuration .. > General: Output Directory, Intermediate Directory
- Qt > Qt Project Settings > Properties: MocDirectory, RccDirectory, UicDirectory
- VS C++開發時ipch、sdf的輸出目錄,可以下修改(嚴重潔癖症患者):
- Tools > Options > Text Editor > C/C++ > Advanced > Fallback Location: Ture, True, Output Directory
- 複製cef的 Debug, Release, include, Resources 到Solution目錄下。
- Debug, Release爲發佈版cef給咱們編譯好的lib,include爲頭文件,Resources爲其資源。
- libcef_dll的代碼移過來,Show All Files > Refresh > Delete多餘的 > Include全部代碼。
- libcef_dll工程屬性配置,以後編譯。右鍵Properties > Configuration ..:
- General > Character Set: Use Unicode Character Set
- C/C++ > General > Additional Include ..: + '..'(上級目錄), 或$(SolutionDir)
- C/C++ > Preprocessor > Preprocessor Definitions: + 'NOMINMAX, USING_CEF_SHARED'
- qcefclient的代碼移過來,同libcef_dll同樣,以後配置編譯:
- General > Character Set: Use Unicode Character Set
- C/C++ > General > Additional Include ..: + '..'(上級目錄), 或$(SolutionDir)
- C/C++ > Preprocessor > Preprocessor Definitions: + 'NOMINMAX'
- Linker > Input > Additional Dependencies:
- .\..$(Configuration)\libcef.lib : cef的lib
- .\..\out$(Configuration)\lib\libcef_dll.lib : libcef_dll工程的lib
- opengl32.lib : opengl的lib,或Qt Project Settings > Qt Modules勾選OpenGL library
- 輸出目錄缺乏cef運行的必要dll等,須要把先前複製的cef的Debug或Release和Resources內的文件複製到輸出目錄。
- 能夠配置預執行命令,右鍵Properties > Configuration .. > Build Events > Pre-Build Event > Command Line:
- xcopy $(SolutionDir)$(Configuration) $(SolutionDir)out$(Configuration) /e /d
- xcopy $(SolutionDir)Resources $(SolutionDir)out$(Configuration) /e /d
- 有不須要複製的文件,可將其名稱放到一個文件裏。而後在xcopy命令最後加exclude參數,如'/exclude:$(SolutionDir)exclude.list'。更多xcopy參數。
cefclient for Qt
簡單瀏覽遍cefclient的代碼,以下:windows
- binding_test.cpp
- binding_test.h > 綁定測試:獲取進程消息及其回覆,與js通訊。對應binding.html
- cefclient.cpp
- cefclient.h > 全局方法:cef全局方法,測試方法實現等
- cefclient_osr_widget_win.cpp
- cefclient_osr_widget_win.h > OpenGL渲染窗口組件
- cefclient_win.cpp > 應用程序入口:初始化cef,創建windows窗口等
- client_app.cpp
- client_app.h > CefApp回調處理類:其被傳遞給了CefExecuteProcess(), CefInitialize()
- 設計了瀏覽器委託和渲染器委託流程。後一測試有dom_test,performance_test。
- 另有自定義協議註冊,測試爲scheme_test。
- 這裏也註冊了js消息調用的擴展,app對象及其方法。
- client_app_delegates.cpp
- client_handler.cpp
- client_handler.h > CefClient回調處理類:其被傳遞給了CefBrowserHost::CreateBrowser()
- 設計了進程消息委託流程。測試包括binding_test, dialog_test, window_test。
- client_handler_win.cpp
- client_renderer.cpp
- client_renderer.h > 客戶端渲染委託:處理節點焦點事件
- client_switches.cpp
- client_switches.h > 用到的命令行參數:More Switches
- dialog_test.cpp
- dialog_test.h > 對話框測試:對應dialogs.html
- dom_test.cpp
- dom_test.h > dom元素選擇測試:對應domaccess.html
- osrenderer.cpp
- osrenderer.h > OpenGL渲染器
- performance_test.cpp
- performance_test.h > V8性能測試:對應performance.html, performance2.html
- performance_test_setup.h
- performance_test_tests.cpp
- resource.h > 資源頭文件
- resource_util.h > 資源工具:由名稱獲取字符串資源、由名稱獲取資源字節流
- resource_util_win.cpp
- scheme_test.cpp
- scheme_test.h > 自定義協議測試:client://
- string_util.cpp
- string_util.h > 字符串工具:請求信息轉爲字符串、字符串替換
- util.h > 一些斷言宏:檢驗Cef當前線程類型
- window_test.cpp
- window_test.h > 窗口測試:對應window.html
- window_test_win.cpp
而後,開始動手術,改造爲Qt窗口:瀏覽器
直接參見改造後的工程qtcefclient。app
參考
- LNK2001: unresolved external symbol ... QMetaObject ...
- CEF3 - Bare Bones
- Qt決定將Web渲染引擎從WebKit改成Chromium
其餘連接
部分Web引擎框架相關連接框架
C++
Qt