还是以windows上vs2017 release版本运行的程序为例。
接上一篇,我们只是将离屏渲染的每一帧图片QImage,以异步事件的方法发送到了目标QWiget上,然后再将QImage绘制到屏幕上。
留下了一些待处理的问题:
- 滚轮事件
- 鼠标的点击事件
- 鼠标hover到链接上,鼠标形状的变化
- 输入框的右键弹出菜单位置问题
- 键盘输入
- 按F5刷新网页
我们这篇博客就围绕这些问题进行处理。
一、离屏渲染的滚轮事件的处理
滚轮事件的处理最为简单。
在CefOSRWidget头文件中:
protected:
//其余代码与前面一篇相同,这里省略
void wheelEvent(QWheelEvent *event) override;
void CefOSRWidget::wheelEvent(QWheelEvent *event)
{
QPoint pos = event->pos();
CefRefPtr<CefBrowser> pBrower = getBrowser();
if (pBrower)
{
CefMouseEvent cefMouseEvent;
cefMouseEvent.x = pos.x();
cefMouseEvent.y = pos.y();
pBrower->GetHost()->SendMouseWheelEvent(cefMouseEvent, 0, event->delta());
}
//因为不必传递给下层,所以下面这行注释掉
//QWidget::wheelEvent(event);
}
cef_browser.h中的定义
class CefBrowserHost : public virtual CefBaseRefCounted {
public:
//其余省略
// Send a mouse wheel event to the browser. The |x| and |y| coordinates are
// relative to the upper-left corner of the view. The |deltaX| and |deltaY|
// values represent the movement delta in the X and Y directions respectively.
// In order to scroll inside select popups with window rendering disabled
// CefRenderHandler::GetScreenPoint should be implemented properly.
///
/*--cef()--*/
virtual void SendMouseWheelEvent(const CefMouseEvent& event,
int deltaX,
int deltaY) = 0;
//其余省略
};
就是向该Cef浏览器发送一个滚轮事件。
本篇博客中的其余做法,也是将手动发送事件给Cef浏览器。
效果:
垂直滚轮有了效果,但是发现鼠标点击滚动条两端的按钮没有效果,这时候,我们就需要手动发送鼠标事件给Cef浏览器了。
二、离屏渲染的鼠标事件的处理
class CefOSRWidget : public QWidget
{
Q_OBJECT
public:
//其余省略
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
//其余省略
private:
//将Qt的鼠标按钮转换成Cef中的鼠标按键(鼠标左键、中键,右键)
cef_mouse_button_type_t toCefMouseButton(Qt::MouseButton mouseButton);
cefosrwidget.cpp中相应的定义:
void CefOSRWidget::mousePressEvent(QMouseEvent *event)
{
QPoint pos = event->pos();
CefRefPtr<CefBrowser> pBrower = getBrowser();
if (pBrower)
{
CefMouseEvent cefMouseEvent;
cefMouseEvent.x = pos.x();
cefMouseEvent.y = pos.y();
cef_mouse_button_type_t cefMouseButton = toCefMouseButton(event->button());
pBrower->GetHost()->SendMouseClickEvent(cefMouseEvent, cefMouseButton, false, 1);
}
//QWidget::mousePressEvent(event);
}
void CefOSRWidget::mouseReleaseEvent(QMouseEvent *event)
{
QPoint pos = event->pos();
CefRefPtr<CefBrowser> pBrower = getBrowser();
if (pBrower)
{
CefMouseEvent cefMouseEvent;
cefMouseEvent.x = pos.x();
cefMouseEvent.y = pos.y();
cef_mouse_button_type_t cefMouseButton