由於使用的Qt是動態連接的,而cef模式使用的是靜態連接的方式,因此在使用前須要將cef編譯方式改爲Multi-thread DLL(/MD),修改路徑在在C/C++->Code Generation下的Runtime Library。從新編譯後的libcef_dll_wrapper.lib庫大概26Mb瀏覽器
爲了快速實現,咱們將使用cefsimple中的源碼,將其嫁接到QtGUI中。app
首先把cef目錄下的include拷貝到新項目中,再將libcef_dll_wrapper.lib和libcef.dll拷貝到新項目的lib目錄下。而後在項目中配置include和lib目錄並將兩個靜態庫添加到Linker->Input下。再將cefsimple中的simple_app.h、simple_app.cc、simple_handler.h、simple_handler.cc、simple_handler_win.cc拷貝到咱們本身的項目源碼目錄下並在項目中添加。函數
新建.h和.cpp文件添加Cef初始化和退出函數oop
1 bool CefInit() 2 { 3 CefEnableHighDPISupport(); 4 5 CefSettings settings; 6 settings.no_sandbox = true; 7 settings.multi_threaded_message_loop = true; 8 9 HINSTANCE inc = GetModuleHandle(NULL); 10 CefMainArgs mainArgs(inc); 11 12 CefRefPtr<CefCommandLine> cmd_line = CefCommandLine::CreateCommandLine(); 13 cmd_line->InitFromString(::GetCommandLineW()); 14 15 CefRefPtr<CefApp> app; 16 app = new SimpleApp; 17 return CefInitialize(mainArgs, settings, app.get(), NULL); 18 }
1 void CefQuit() 2 { 3 CefShutdown(); 4 }
在Qt的Gui類中添加初始化瀏覽器的方法ui
1 void QBrowser::InitBrowser() 2 { 3 CefWindowInfo cefWndInfo; 4 QString strUrl = "http://baidu.com"; 5 HWND wnd = (HWND)ui.fmBrowser->winId(); 6 7 RECT winRect; 8 9 QDesktopWidget* pDeskTop = QApplication::desktop(); 10 QRect qtRect = pDeskTop->screenGeometry(); 11 winRect.left = qtRect.left(); 12 winRect.top = qtRect.top(); 13 winRect.right = qtRect.right(); 14 winRect.bottom = qtRect.bottom(); 15 16 cefWndInfo.SetAsChild(wnd, winRect); //將cef界面嵌入qt界面中 17 18 CefBrowserSettings cefBrowSetting; 19 m_browserEvent = CefRefPtr<SimpleHandler>(new SimpleHandler(true)); 20 bool browser = CefBrowserHost::CreateBrowser(cefWndInfo, m_browserEvent, strUrl.toStdString(), cefBrowSetting, NULL); 21 22 emit resize(qtRect.width(), qtRect.height()); //設置軟件全屏 23 }
爲了響應程序窗口大小變化,重載ResizeEvent方法spa
1 void QBrowser::resizeEvent(QResizeEvent *event) 2 { 3 if (m_browserEvent.get() == NULL) 4 { 5 return; 6 } 7 8 QRect qtRect = ui.fmBrowser->rect(); 9 const BrowserList browList = m_browserEvent->GetBrowserList(); 10 11 if (!browList.empty()) 12 { 13 HWND wnd = browList.front()->GetHost()->GetWindowHandle(); 14 ::MoveWindow(wnd, qtRect.x(), qtRect.y(), qtRect.width(), qtRect.height(), true); 15 } 16 }
記得在構造Gui類的時候調用InitBrowser方法!code
最後在Main函數中進行Cef的初始化和銷燬函數blog
int main(int argc, char *argv[]) { QApplication a(argc, argv); CefInit(); QBrowser w; w.show(); a.exec(); CefQuit(); return 0; }
而後能夠編譯運行了get
運行後發現,有兩個窗口,由於simpleApp中也有一個初始化函數OnContextInitialized,咱們在這個初始化函數開始位置進行reture便可。cmd
萬事開頭難,有了這樣一個小小的Demo以後咱們就能夠慢慢的分析cefsimple的實現,而後再將cef其餘功能做用都添加到咱們的項目中了。