【筆記】給Qt內嵌一個Chrome吧

給Qt內嵌一個Chrome吧

CEF簡述

CEF(Chromium Embedded Framework),是一個用於開發Web瀏覽器控件的開源項目,其基於Google Chromium。php

參考

  1. CEF:給客戶端內嵌一個Chrome吧
  2. 理解WebKit和Chromium: Content API和CEF3
  3. CEF3筆記
  4. CEF中文教程

環境準備

Qt環境

下載,依次安裝,嘗試創建個Qt工程,運行ok便可。詳見參考2css

CEF環境

運行配置,詳見參考3。不過,我並無安裝 Jun10 DX SDK 。html

  1. 安裝 VS10 SP1 ,是由於先前安裝了VS2012,編譯cefclient時,遇到了 'LINK : fatal error LNK1123' 的問題,詳見參考4
  2. 安裝 Win8 SDK ,'..\Windows Kits\8.0\Include\winrt\asyncinfo.h' 66行的 class 須要註釋掉,參考3內有詳細描述。(不安裝,應該也能編譯發佈版的cef)

參考

  1. Visual Studio各版本下載合集
  2. QT4.8.5+qt-vs-addin-1.1.11+VS2010安裝配置和QT工程的新建和加載
  3. Build Instructions (Windows)
  4. LINK : fatal error LNK1123

CEF編譯

源碼

cef3主分支源碼,能夠用TortoiseSVN來獲取。不過,我用的是後一個發佈版本。更多可見CEF Downloadsgit

解壓cef_xxx.7z,打開cefclient2010.sln,F5編譯運行。github

CEF for Qt

QMake編譯

qmake來編譯cef代碼。這裏新建Qt工程,再將cef代碼移過來,進行工程配置。基本步驟以下:web

  1. 新建Qt工程cefclient,Solution爲'qcef'。
  2. 右鍵Solution,追加libcef_dll的Qt static lib工程。
  3. 右鍵Solution > Properties > Common > Dependencies,cefclient depends on libcef_dll。
  4. 配置工程的各輸出目錄,可修改配置有:
    • 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
  5. 複製cef的 Debug, Release, include, Resources 到Solution目錄下。
    • Debug, Release爲發佈版cef給咱們編譯好的lib,include爲頭文件,Resources爲其資源。
  6. libcef_dll的代碼移過來,Show All Files > Refresh > Delete多餘的 > Include全部代碼。
  7. 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'
  8. 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
  9. 輸出目錄缺乏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窗口:瀏覽器

直接參見改造後的工程qtcefclientapp

參考

  1. LNK2001: unresolved external symbol ... QMetaObject ...
  2. CEF3 - Bare Bones
  3. Qt決定將Web渲染引擎從WebKit改成Chromium

其餘連接


部分Web引擎框架相關連接框架

C++

Qt

相關文章
相關標籤/搜索