Qt5.9.1結合REF開發基於chorm的瀏覽器(二)

將libcef_dll_wrapper編譯方式設置爲MD

由於使用的Qt是動態連接的,而cef模式使用的是靜態連接的方式,因此在使用前須要將cef編譯方式改爲Multi-thread DLL(/MD),修改路徑在在C/C++->Code Generation下的Runtime Library。從新編譯後的libcef_dll_wrapper.lib庫大概26Mb瀏覽器

新建QtGUI項目

  爲了快速實現,咱們將使用cefsimple中的源碼,將其嫁接到QtGUI中。app

  首先把cef目錄下的include拷貝到新項目中,再將libcef_dll_wrapper.liblibcef.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其餘功能做用都添加到咱們的項目中了。

相關文章
相關標籤/搜索