Windows下Qt Creator中使用cef的一个学习例子

参考:https://blog.csdn.net/qq_31683775/article/details/84025025


qt中集成cef浏览器例子qtCefBrowser
参考上上篇文章,vs2017编译生成:libcef_dll_wrapper.lib(静态库,debug-MDd,release-MD)

qtCefBrowser工程结构如下:

qt代码如下:

qtCefBrowser.pro


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
#-------------------------------------------------
#
# Project created by QtCreator 2020-01-08T09:18:32
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = cefBrowser
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp\
    simple_app.cc \
    simple_handler.cc \
    widget.cpp

HEADERS  += simple_app.h \
    simple_handler.h \
    widget.h

CONFIG += debug_and_release

FORMS    += widget.ui

INCLUDEPATH+=$$PWD/cef/

LIBS += shell32.lib \
kernel32.lib \
user32.lib \
ole32.lib \
oleaut32.lib \
gdi32.lib

CONFIG(debug, debug|release) {
    LIBS += $$PWD/cef/lib/debug/libcef.lib              \
            $$PWD/cef/lib/debug/libcef_dll_wrapper.lib  \
}else{
    LIBS += $$PWD/cef/lib/release/libcef.lib              \
            $$PWD/cef/lib/release/libcef_dll_wrapper.lib  \
}

RC_FILE += icon.rc

simple_app.h


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#ifndef CEF_TESTS_CEFSIMPLE_SIMPLE_APP_H_
#define CEF_TESTS_CEFSIMPLE_SIMPLE_APP_H_

#include "include/cef_app.h"

// Implement application-level callbacks for the browser process.
class SimpleApp : public CefApp,
                  public CefBrowserProcessHandler {
 public:
   SimpleApp();

// CefApp methods:
  virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()
      OVERRIDE { return this; }

// CefBrowserProcessHandler methods:
  virtual void OnContextInitialized() OVERRIDE;
  void OnBeforeCommandLineProcessing(const CefString & process_type, CefRefPtr<CefCommandLine> command_line);
 private:
  // Include the default reference counting implementation.
  IMPLEMENT_REFCOUNTING(SimpleApp);
};

#endif  // CEF_TESTS_CEFSIMPLE_SIMPLE_APP_H_

simple_app.cc


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#include "simple_app.h"

#include <string>

#include "simple_handler.h"
#include "include/cef_browser.h"
#include "include/cef_command_line.h"
#include "include/wrapper/cef_helpers.h"

SimpleApp::SimpleApp()
{
}

void SimpleApp::OnContextInitialized()
{
    CEF_REQUIRE_UI_THREAD();

}
void SimpleApp::OnBeforeCommandLineProcessing(const CefString &process_type, CefRefPtr<CefCommandLine> command_line)
{
    //加载flash插件
    command_line->AppendSwitch("--enable-npapi");
    command_line->AppendSwitchWithValue("--ppapi-flash-path", "ppflash/pepflashplayer32_32_0_0_303.dll");
    //manifest.json中的version
    command_line->AppendSwitchWithValue("--ppapi-flash-version", "32.0.0.303");
    command_line->AppendSwitch("--disable-extensions");
}

simple_handler.h


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#ifndef CEF_TESTS_CEFSIMPLE_SIMPLE_HANDLER_H_
#define CEF_TESTS_CEFSIMPLE_SIMPLE_HANDLER_H_

#include "include/cef_client.h"
#include <list>
// List of existing browser windows. Only accessed on the CEF UI thread.
typedef std::list<CefRefPtr<CefBrowser> > BrowserList;
class Widget;
class SimpleHandler : public CefClient,
    public CefDisplayHandler,
    public CefLifeSpanHandler,
    public CefLoadHandler
{
public:
    SimpleHandler(Widget *widget);
    ~SimpleHandler();

// Provide access to the single global instance of this object.
    static SimpleHandler *GetInstance();

// CefClient methods:
    virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE
    {
        return this;
    }
    virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE
    {
        return this;
    }
    virtual CefRefPtr<CefLoadHandler> GetLoadHandler() OVERRIDE
    {
        return this;
    }

// CefLifeSpanHandler methods:
    virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;
    virtual bool DoClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
    virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;

// CefLoadHandler methods:
    virtual void OnLoadError(CefRefPtr<CefBrowser> browser,
                             CefRefPtr<CefFrame> frame,
                             ErrorCode errorCode,
                             const CefString &errorText,
                             const CefString &failedUrl) OVERRIDE;

// Request that all existing browser windows close.
    void CloseAllBrowsers(bool force_close);

bool IsClosing() const
    {
        return is_closing_;
    }
    BrowserList GetBrowserList()
    {
        return browser_list_;
    }
private:
    BrowserList browser_list_;
    Widget *widget;

bool is_closing_;

// Include the default reference counting implementation.
    IMPLEMENT_REFCOUNTING(SimpleHandler);
};

#endif  // CEF_TESTS_CEFSIMPLE_SIMPLE_HANDLER_H_

simple_handler.cc


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#include "simple_handler.h"

#include <sstream>
#include <string>

#include "include/base/cef_bind.h"
#include "include/cef_app.h"
#include "include/wrapper/cef_closure_task.h"
#include "include/wrapper/cef_helpers.h"
#include "widget.h"
namespace
{
    SimpleHandler *g_instance = NULL;
}  // namespace

SimpleHandler::SimpleHandler(Widget *w)
    : is_closing_(false)
{
    DCHECK(!g_instance);
    g_instance = this;
    this->widget = w;
}

SimpleHandler::~SimpleHandler()
{
    g_instance = NULL;
}

// static
SimpleHandler *SimpleHandler::GetInstance()
{
    return g_instance;
}

void SimpleHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser)
{
    CEF_REQUIRE_UI_THREAD();

 // Add to the list of existing browsers.
    browser_list_.push_back(browser);
    int
 nID = browser->GetIdentifier();

    widget->browserId = nID;

}

bool SimpleHandler::DoClose(CefRefPtr<CefBrowser> browser)
{
    CEF_REQUIRE_UI_THREAD();

// Closing the main window requires special handling. See the DoClose()
    // documentation in the CEF header for a detailed destription of this
    // process.
    if (browser_list_.size() == 1)
    {
        // Set a flag to indicate that the window close should be allowed.
        is_closing_ = true;
    }

// Allow the close. For windowed browsers this will result in the OS close
    // event being sent.
    return false;
}

void SimpleHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser)
{
    CEF_REQUIRE_UI_THREAD();

// Remove from the list of existing browsers.
    BrowserList::iterator bit = browser_list_.begin();
    for (; bit != browser_list_.end(); ++bit)
    {
        if ((*bit)->IsSame(browser))
        {
            browser_list_.erase(bit);
            break;
        }
    }

if (browser_list_.empty())
    {
        // All browser windows have closed. Quit the application message loop.
        CefQuitMessageLoop();
    }
}

void SimpleHandler::OnLoadError(CefRefPtr<CefBrowser> browser,
                                CefRefPtr<CefFrame> frame,
                                ErrorCode errorCode,
                                const CefString &errorText,
                                const CefString &failedUrl)
{
    CEF_REQUIRE_UI_THREAD();

// Don‘t display an error for downloaded files.
    if (errorCode == ERR_ABORTED)
        return;

// Display a load error message.
    std::stringstream ss;
    ss << "<html><body bgcolor=\"white\">"
       "<h2>Failed to load URL " << std::string(failedUrl) <<
       " with error " << std::string(errorText) << " (" << errorCode <<
       ").</h2></body></html>";
    frame->LoadString(ss.str(), failedUrl);
}

void SimpleHandler::CloseAllBrowsers(bool force_close)
{
    if (!CefCurrentlyOn(TID_UI))
    {
        // Execute on the UI thread.
        CefPostTask(TID_UI,
                    base::Bind(&SimpleHandler::CloseAllBrowsers, this, force_close));
        return;
    }

if (browser_list_.empty())
        return;

BrowserList::const_iterator it = browser_list_.begin();
    for (; it != browser_list_.end(); ++it)
        (*it)->GetHost()->CloseBrowser(force_close);
}

widget.h


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "simple_handler.h"
namespace Ui
{
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    int browserId;

private:
    Ui::Widget *ui;
    CefRefPtr<SimpleHandler> m_browserEvent;
    CefRefPtr<CefBrowser> GetBrowserByID(int nWebBrowserID);

public slots:
    void onUrl();

};

#endif // WIDGET_H

widget.cpp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
#include "widget.h"
#include "ui_widget.h"
#include <QDesktopWidget>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    HWND wnd = (HWND)ui->widget->winId();

CefWindowInfo cefWndInfo;
    QString strUrl = "https://www.baidu.com";
    RECT winRect;

QDesktopWidget *pDeskTop = QApplication::desktop();
    QRect qtRect = pDeskTop->screenGeometry();
    winRect.left = qtRect.left();
    winRect.top = qtRect.top();
    winRect.right = qtRect.right();
    winRect.bottom = qtRect.bottom();

//将cef界面嵌入qt界面中
    cefWndInfo.SetAsChild(wnd, winRect);

CefBrowserSettings cefBrowSetting;
    m_browserEvent = CefRefPtr<SimpleHandler>(new SimpleHandler(this));
    bool browser = CefBrowserHost::CreateBrowser(cefWndInfo, m_browserEvent, strUrl.toStdString(), cefBrowSetting, NULL);
    connect(ui->goButton, SIGNAL(clicked()), this, SLOT(onUrl()));
    showMaximized();
}

Widget::~Widget()
{
    delete ui;
}

CefRefPtr<CefBrowser> Widget::GetBrowserByID(int nWebBrowserID)
{
    BrowserList browserList = m_browserEvent->GetBrowserList();
    for (auto it = browserList.begin();
            it != browserList.end();
            ++it)
    {
        if (nWebBrowserID == it->get()->GetIdentifier())
        {
            return it->get();
        }
    }

return nullptr;
}

void Widget::onUrl()
{
    CefRefPtr<CefBrowser> brower = GetBrowserByID(browserId);
    if (nullptr != brower)
    {
        brower->GetMainFrame()->LoadURL(ui->lineEdit->text().toStdString());
    }
}

widget.ui


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>711</width>
    <height>371</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>qt cef browser</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <property name="spacing">
    <number>0</number>
   </property>
   <property name="leftMargin">
    <number>0</number>
   </property>
   <property name="topMargin">
    <number>0</number>
   </property>
   <property name="rightMargin">
    <number>0</number>
   </property>
   <property name="bottomMargin">
    <number>0</number>
   </property>
   <item>
    <widget class="QWidget" name="toolbar" native="true">
     <property name="minimumSize">
      <size>
       <width>0</width>
       <height>40</height>
      </size>
     </property>
     <property name="maximumSize">
      <size>
       <width>16777215</width>
       <height>40</height>
      </size>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <property name="spacing">
       <number>0</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
      </property>
      <property name="topMargin">
       <number>0</number>
      </property>
      <property name="rightMargin">
       <number>0</number>
      </property>
      <property name="bottomMargin">
       <number>0</number>
      </property>
      <item>
       <widget class="QLineEdit" name="lineEdit">
        <property name="minimumSize">
         <size>
          <width>0</width>
          <height>40</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>16777215</width>
          <height>40</height>
         </size>
        </property>
        <property name="styleSheet">
         <string notr="true">font-size:16px;</string>
        </property>
        <property name="text">
         <string>http://www.baidu.com</string>
        </property>
        <property name="placeholderText">
         <string>Please input URL...</string>
        </property>
        <property name="clearButtonEnabled">
         <bool>true</bool>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="goButton">
        <property name="minimumSize">
         <size>
          <width>0</width>
          <height>40</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
          <width>16777215</width>
          <height>40</height>
         </size>
        </property>
        <property name="styleSheet">
         <string notr="true">font-size:15px;
font: 16pt "Arial";</string>
        </property>
        <property name="text">
         <string>Go</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QWidget" name="widget" native="true"/>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

构建运行:

原文地址:https://www.cnblogs.com/MakeView660/p/12166287.html

时间: 2024-10-08 19:20:03

Windows下Qt Creator中使用cef的一个学习例子的相关文章

Windows 下 Qt Creator 5.3.1 环境构建

首先,要下载到Qt for Windows.Qt已经正式分割成两个开源和商用两个不用的项目.我们需要在开源上下载Qt的安装程序(地址:http://qt-project.org/downloads). 开源 : http://qt-project.org/ 商用 : http://qt.digia.com/ 可以看到很多个版本,这里任意一个 for windows 的版本都有带Qt Creator,可以根据你VS的版本选择.我已经习惯了Qt Creator所以使用的是Qt 5.3.1 for W

windows下QT creator+openCV配置和使用

网上的教程都是教怎么用minGW和cmake编译opencv然后再导入,简直太麻烦了,不利于新手,这里有个简单的方法. 1.安装qt sdk 我装的是qt 5.3 msvc版32位,内置了qt creator,直接用windows带的msvc编译器. 2.安装opencv 我装的是opencv2.4.9,解压到D盘根目录下了. 3.在qt creator中建一个标准的控制台C++工程项目. 随便建哪种项目都是可以的,这里为了方便直接建立最简单的C++控制台项目. 4.配置opencv的环境变量(

关于windows下QT以及QT creator的安装

普及  之  windows下qt的安装及配置 qt介绍 : Qt,分为商业.开源两个版本,商业版需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才能生产动态库文件. 所以以下介绍开源版本(原因嘛,,自然是因为免费): Qt开发需要安装qt library 和 qt creator qt library为Qt的程序提供头文件.静态链接库 和动态链接库 qt creator 是用于编程的IDE ,提供GUI界面绘制.代码编写.程序调试等多个功能. QT在win

QT creator中使用opencv

最近要用到opencv做图像方面的东西,网上很多是用VS加opencv,但自己对VS不怎么喜欢,想用QT Creator.在网上搜索了很多资料,终于花了一天的时间,在QT Creator上能使用opencv了. 需要的软件:(1)QT Creator.我的版本是4.8.5.这个版本还是在学习亚飞的QT Creator的时候安装的,网上有说QT版本低,而opencv版本高的话,可能在执行mingw32-make命令会报错.因此为了以防万一,我下载的低版本的opencv (2)opencv.我的版本

Qt Creator中使用qss对界面美化没有作用(效果)的问题

最近在研究qt界面开发,发现使用qss对界面进行美化后效果不错,要比mfc效率高很多,美化效果也很出色.但是在使用qss文件对界面控件进行美化的过程中遇到了个很奇葩的问题,困惑了我好久,今晚又遇到了,感觉整个人都不好了,问题症状如下: (1)我在Qt Creator中新建了一个工程,添加qss文件及内容后运行,加载qss文件并运行程序,qss美化效果死活出不来(经检查,qss内容及加载过程都正确): (2)在Qt Creator中打开一个现有项目,该项目中含有qss文件,能正确加载,在别的电脑上

Mac下Qt Creator无法输入中文的解决方法

在Mac下Qt Creator无法输入中文,就算是切换为了中文输入法也无济于事.于是找了一下设置.在[偏好设置]中,有一个[语言]的下拉框,将其设置为Chinese(China),然后保存,重启就可以了.如图所示

WIN7 下 Qt Creator 安装 QWT

WIN7 下 Qt Creator 安装 QWT 环境:WIN7 +QT Creator2.6.2 1.下载QWT源代码 qwt-6.1-rc3.zip 2 编译QWT open projects->找到解压后的qwt-6.0.1中的qwt.pro文件->open,找到designer ->qwtbuild->qwtbuild.pri 修改为 5.运行build 6 1)将qwt源码D:\Qt\qwt-6.1-rc3\lib目录下的*.dll复制到 QT SDK  D:\Qt\Qt

Qt入门学习——Qt Creator 中 ui 文件和 Qt 代码关系

通过<Qt Creator的使用>的学习,我们可以借助 Designer(界面设计器)快速设计界面. 此例子 ui 内容如下(只是简单添加了一个按钮): 工程的代码目录结构如下: 最终在工程所在目录会生成一个 ui 文件: 此 ui 文件实际上是xml 文件: 当我们编译 Qt 程序代码,Qt Creator 用 uic 工具把 ui 文件的内容转换成 C++ 代码,在工程目录同一级目录的 build- 目录下自动生成 ui_类名.h 文件,如本例子中的 ui_mywidget.h,是由 my

win7/10下Qt Creator调试提示:The selected debugger may be inappropriate for the inferior的解决办法

在win7/10下Qt Creator调试提示:The selected debugger may be inappropriate for the inferior的错误提示内容如下图所示: 一般弹出这个提示是很难进入调试,也看不到调试输出信息的.看到这个报错令人很失望. 解决:下载windows sdk  win10 sdk 只安装Debugging Tools for Windows 打开 工具-选项-Kits 安装sdk成功后我们可以看到 已经检测到了我们安装的cdb 打开工具-选项-构