打开下拉菜单后在 QtWebEngine 中触摸冻结

Posted

技术标签:

【中文标题】打开下拉菜单后在 QtWebEngine 中触摸冻结【英文标题】:Touch freeze in QtWebEngine after opening a DropDown menu 【发布时间】:2020-06-02 13:13:06 【问题描述】:

我在使用触摸屏时偶然发现了QtWebEngine 问题。我可以通过触摸屏浏览所有网站,但是当我点击下拉菜单(例如在https://www.ebay.com/ 点击搜索字段旁边的“所有类别”)时,触摸不再起作用(或 1/30 触摸点击作品)。我仍然可以通过鼠标/键盘关闭它。关闭 DropDown 菜单后,touch 又开始工作了。

我创建了一个小的示例浏览器:

BrowserWidget::BrowserWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::BrowserWidget),
      m_webView(new QWebEngineView(this)), m_page(new QWebEnginePage(this)) 
  ui->setupUi(this);
  ui->verticalLayout->addWidget(m_webView);

  m_page->setUrl(QUrl(QStringLiteral("https://www.ebay.com/")));
  m_webView->setPage(m_page);

  m_webView->setAttribute(Qt::WA_AcceptTouchEvents);
  m_webView->installEventFilter(this);


bool BrowserWidget::eventFilter(QObject *watched, QEvent *e) 
  qDebug() << "event: " << e->type();

  if (e->type() == QEvent::ChildAdded) 
    QChildEvent *ce = static_cast<QChildEvent *>(e);
    if (ce && ce->child()) 
      ce->child()->installEventFilter(this);
    
  

  return false;

我将事件过滤器安装到 QEvent::ChildAdded 中的小部件中,以便更好地调试(这样我可以观察更多事件)。

这种行为总是可以重现的,我不知道我是否做错了什么,因为我可以通过触摸操作浏览器。我还在子小部件中添加了Qt::WA_AcceptTouchEvents,但没有任何区别。

希望有人能帮帮我,谢谢!

【问题讨论】:

【参考方案1】:

发现是Qt-bug https://bugreports.qt.io/browse/QTBUG-79254

我为这个问题创建了一个解决方法,也许将来有人需要这个:

bool WebEngineView::event(QEvent *e)

  // Workaround for QTBUG-79254: DropDown-menus are not accepting any touchevents
  if (e->type() == QEvent::ChildAdded) 
    QChildEvent *ce = static_cast<QChildEvent *>(e);

    if (ce && ce->child() && ce->child()->isWidgetType()) 
      QWidget *child = static_cast<QWidget *>(ce->child());

      if (child->windowFlags() & Qt::Popup) 
        Qt::WindowFlags flags = child->windowFlags();
        flags = flags & (~Qt::Popup) | Qt::Dialog;
        child->setWindowFlags(flags);
      
    
  

  return QWebEngineView::event(e);

【讨论】:

以上是关于打开下拉菜单后在 QtWebEngine 中触摸冻结的主要内容,如果未能解决你的问题,请参考以下文章

vscode运行js文件成功后在html中点击链接还是打不开

基于触摸的设备上的下拉菜单

单击触摸设备 (iPad/iPhone) 上的任意位置以隐藏由 .hover() 切换的下拉菜单

css / jquery中的移动(触摸)设备友好下拉菜单

Bootstrap 导航栏响应式下拉菜单不响应触摸

触摸屏用户必须点击链接两次才能工作