QWebEngineView 如何禁用捏合缩放

Posted

技术标签:

【中文标题】QWebEngineView 如何禁用捏合缩放【英文标题】:QWebEngineView how to disable pinch-to-zoom 【发布时间】:2019-09-26 10:28:41 【问题描述】:

我在显示 html 网页的触摸 Linux 设备上运行带有 QWebView 的 Qt 5.9.4 应用程序。

当用户在屏幕上捏手指时,他们会放大网页。我想禁用该行为,因为所有网页都应该 100% 全屏显示。

我可以通过将user-scalable=no 添加到视口来暂时在网页中禁用它(因为我拥有他们的代码),但从长远来看这不会起作用,因为不是每个网页都会有它。

我尝试在我的应用程序的不同元素上使用 eventFilter,但无法捕获任何手势甚至鼠标事件。

这就是我创建 web 视图的方式(在 QDialog 中):

void Dialog::createWebView() 
  view = new QWebEngineView(this);
  profile = new QWebEngineProfile();
  page = new QWeEnginePage(profile);
  view->setPage(page);
  view->setUrl(QUrl(path));

这是我的 eventFilter 类:

EvFilter::EvFilter(QObject *parent) : QObject(parent)




bool EvFilter::eventFilter(QObject *obj, QEvent *event)


    qDebug() << event->type() << "\n";
    return QObject::eventFilter(obj, event);

我试过了

EvFilter* evf = new EvFilter();
view->installEventFilter(evf);

而且在所有其他元素(配置文件、页面、对话框)上,但似乎无法获得与鼠标或手势对应的任何事件。 我究竟做错了什么?我怎样才能在整个 webview 中防止这种行为?

将事件侦听器添加到 QApplication 对象后,我可以检测到 TouchBegin、TouchUpdate、TouchCancel 和 TouchEnd 事件,但没有其他(没有 Gesture 事件)。我不知道如何检测 touchevent 是否是缩放手势。

【问题讨论】:

尝试在view-&gt;setUrl(QUrl(path));之后添加EvFilter* evf = new EvFilter(); view-&gt;focusProxy()-&gt;installEventFilter(evf); @eyllanesc 不幸的是,它的工作方式与在整个 QApplication 上安装它的方式相同,我可以看到触摸事件,但我不知道如何知道它们何时用于缩放以及何时只是正常触摸事件。我想在所有设备上完全禁用缩放。是否可以?我找不到任何禁用缩放的设置。 【参考方案1】:

我认为你可以在对话框上使用它(没有测试它)。我有一些其他小部件显示 QML QtWebView,而我为防止小部件的孩子获得捏手势所做的事情是:

this->grabGesture(Qt::PinchGesture, Qt::DontStartGestureOnChildren);

这会阻止底层小部件接收 PinchGesture,以便您自己处理。

【讨论】:

以上是关于QWebEngineView 如何禁用捏合缩放的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式启用/禁用捏合以放大 WKWebView 和 viewForZoomingInScrollView

当 1 根手指在屏幕上抬起时禁用捏合识别器

Android:自定义视图缩放/捏合

如何在 QWebEngineView 中禁用工具提示(标题)的自动换行

UIScrollView 并取消缩放捏合手势

如何在捏合和缩放时找出地图的中心点