打开下拉菜单后在 QtWebEngine 中触摸冻结
Touch freeze in QtWebEngine after opening a DropDown menu
我在使用 触摸屏 时遇到了 QtWebEngine
问题。我可以通过触摸屏浏览所有网站,但是当我单击下拉菜单时(例如 https://www.ebay.com/ 单击搜索字段旁边的 "All categories"),触摸不再起作用(或 1 /30 触摸点击有效)。我仍然可以通过 mouse/keyboard 关闭它。关闭 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
,但没有任何区别。
希望大家能帮帮我,谢谢!
发现这是一个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
问题。我可以通过触摸屏浏览所有网站,但是当我单击下拉菜单时(例如 https://www.ebay.com/ 单击搜索字段旁边的 "All categories"),触摸不再起作用(或 1 /30 触摸点击有效)。我仍然可以通过 mouse/keyboard 关闭它。关闭 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
,但没有任何区别。
希望大家能帮帮我,谢谢!
发现这是一个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);
}