QWebEngineView 中的 Qt 事件传播

2023-12-14

我有一个名为generate_input_event。我正在尝试使用此函数来模拟 QWebEngineView 中的按键。

def generate_input_event(window_id, key_code, modifiers, low_level_data, x, y):
    modifiers_flag = create_modifiers_flag(modifiers)
    logging.info("generate input, window: {} code: {}, modifiers {}".format(
        window_id, key_code, modifiers_flag))
    event = QKeyEvent(QEvent.KeyPress, key_code, modifiers_flag)
    event.artificial = True
    event_window = window.get_window(window_id)
    QCoreApplication.sendEvent(event_window.qtwindow, event)

每当我运行程序并突出显示 QWebEngineView 中的输入字段并调用generate_input_event预计它将将该字母输入到输入字段中。

我还设置了一个事件过滤器来捕获除人工生成的按键之外的所有按键。

class EventFilter(QWidget):
    def __init__(self, parent=None):
        super(EventFilter, self).__init__(parent)
        qApp.installEventFilter(self)

    def eventFilter(self, obj, event):
        if (event.type() == QEvent.KeyPress and hasattr(event, 'artificial')):
            logging.info("artificial event")
            return False. # send to widget
        elif (event.type() == QEvent.KeyPress and not is_modifier(event.key())):
            modifiers = create_modifiers_list(event.modifiers())
            key_string = create_key_string(event)
            key_code = event.key()
            logging.info("send code: {} string: {} modifiers {}".format(
                key_code, key_string, modifiers))
            return True. # do not forward to widgets
        return False

但是,当我实际运行代码时,我得到以下输出:

INFO:root:send code: 65 string: a modifiers ['']
INFO:root:generate input, window: 1 code: 65, modifiers <PyQt5.QtCore.Qt.KeyboardModifiers object at 0x106a4ea58>
INFO:root:artificial event

输出looks正确的,但是,QWebEngineView的输入字段实际上从未收到由人为生成的字母generate_input_event.

附:如果您出于上下文原因希望查看整个文件/项目,请在此处查看此分支/文件:https://github.com/atlas-engineer/next/blob/generate_events/ports/pyqt-webengine/utility.py


Qt Webengine 使用 RenderWidgetHostViewQtDelegateWidget 进行渲染,这是在加载页面后创建的,因此您必须在 load() 或 setHtml() 之后访问它,以便小部件必须发送这些事件。

以下示例将显示 QWebEngineView 和 QLineEdit,显示两个窗口后,您在 QLineEdit 中键入的内容将显示在 QWebEngineView 中。

from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets


class EventFilter(QtCore.QObject):
    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.KeyPress and hasattr(
            event, "artificial"
        ):
            print("event:", event.key(), event.text())
            return False
        return super().eventFilter(obj, event)


class ForwardKeyEvent(QtCore.QObject):
    def __init__(self, sender, receiver, parent=None):
        super(ForwardKeyEvent, self).__init__(parent)
        self.m_sender = sender
        self.m_receiver = receiver
        self.m_sender.installEventFilter(self)

    def eventFilter(self, obj, event):
        if self.m_sender is obj and event.type() == QtCore.QEvent.KeyPress:
            # self.m_receiver.setFocus()
            new_event = QtGui.QKeyEvent(
                QtCore.QEvent.KeyPress,
                event.key(),
                event.modifiers(),
                event.text(),
            )
            new_event.artificial = True
            QtCore.QCoreApplication.postEvent(self.m_receiver, new_event)
        return super().eventFilter(obj, event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    ef = EventFilter()
    app.installEventFilter(ef)

    lineedit = QtWidgets.QLineEdit()
    lineedit.show()

    view = QtWebEngineWidgets.QWebEngineView()
    view.resize(640, 480)
    view.show()

    view.load(QtCore.QUrl("https://www.google.com/"))
    # RenderWidgetHostViewQtDelegateWidget is created after loading a page 
    # so you must access it after load() or setHtml().
    render_widget = view.findChild(QtWidgets.QWidget)
    print(render_widget.metaObject().className())
    assert(render_widget)
    fe = ForwardKeyEvent(lineedit, render_widget)
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QWebEngineView 中的 Qt 事件传播 的相关文章

随机推荐

  • JavaScript 对象与 JSON

    我想清楚地了解 JavaScript 对象和 JSON 字符串之间的基本区别 假设我创建了以下 JavaScript 变量 var testObject one 1 two 2 three 3 问题 1 键 属性名称带引号 不带引号都有效吗
  • Objective-C NSString 引用类型

    我有一个简单的问题 如果我声明 NSString 引用类型 如下所示 NSString johnsMoney 200 NSString marysMoney johnsMoney NSLog Johns Money johnsMoney N
  • 如何在git中维护生产和开发分支?

    在我的项目中我有这个constants ts存储我的文件API URL 我想在我的生产 主 和开发分支中保留两个 API URL 例如 开发 gt API URL http localhost 4000 主要 gt APIURL https
  • 通过模拟器设置温度

    我在模拟器上运行此代码来读取温度变化 但它从未检测到温度变化onSensorChanged 我使用此命令通过 telnet 工具更改温度 传感器设定温度1 2 3 我做错了什么 public class SensorActivity ext
  • 如何使用 Java StAX 格式化和读取 XML 处理指令?

    首先 我如何格式化XML处理指令 是不是 使用 StAX 然后我想通过处理来读取它XMLStreamConstants PROCESSING INSTRUCTION javadoc 事件 但它只提供了两种方法来从事件中检索有关处理指令的信息
  • 将 MYSQL 日期时间四舍五入到最早的 15 分钟间隔(以毫秒为单位)(PHP)

    我正在从 MYSQL 获取日期时间 如下所示 2010 08 11 11 18 28 我需要将其转换为 下限 或最早的 15 分钟间隔 并以毫秒为单位输出给另一个函数 所以 这种情况是 2010 08 11 11 15 00 以毫秒为单位
  • 重定向期间在 RestSharp 中保留授权标头

    我正在使用 RestSharp 进行 GET api 调用 api 调用通过传递授权标头通过 HTTP 基本身份验证进行身份验证 服务器使用状态代码 307 重定向 api 调用 我的客户端代码确实处理重定向 但授权标头未传递到此重定向的
  • Fiddler2:解密 HTTPS 流量和到主机的隧道:443

    我使用Fiddler2来分析一些使用https连接的页面 我启用了 HTTPS 解密 但我的日志中仍然看到一些 Tunnel to host 443 条目 我可以在日志中看到解密的 HTTPS 流量 因此我假设解密有效 我认为 打开连接时
  • 如何使用 CSS 使背景变暗?

    我有一个包含文本的元素 每当我降低不透明度时 我就会降低整个身体的不透明度 有什么办法可以让我background image更暗 而不是其他一切 background image url http fc02 deviantart net
  • 在mysql中使用单个关键字从多个表中搜索[重复]

    这个问题在这里已经有答案了 我有3张桌子 表 1 用户 uid uname 1 John99 2 Steve12 3 Smith a 4 Robert t 5 Williams a 表 2 名字 eid fname 1 John
  • 如何将我在 name.com 上购买的域名与我的 herokuapp 连接起来?

    我在 Name com 上购买了域名 我在 heroku 上找到了我的应用程序 在heroku上添加了一个新的 自定义域 Domain Name DNS Target mydomain com mydomain com herokudns
  • 如何打包我正在使用的 python 库,以便我可以将它们与我的应用程序一起分发,并尽可能减少依赖项

    如何打包我正在使用的 python 库 以便我可以将它们与我的应用程序一起分发 并具有尽可能少的依赖项 并且不与我的系统上已有的不同库 版本发生冲突 L E 抱歉我忘了具体说明 我将在 Linux 上执行此操作 我并不是指使我的应用程序成为
  • string.find(" ") 未找到空格

    我正在尝试在用户输入的字符串中查找空格 我想用find from std string返回空间的位置 如果输入是 西雅图 华盛顿州美国 我想要find 0 回来8 我该怎么做 第八个是 后面的空格 string inputString co
  • 如何使用 xcopy 从文本文件复制文件和文件夹结构?

    我有一个包含文件和文件夹列表的文本文件 我想做的是使用 xcopy 复制文本文件中写入的内容 我的文本文件如下所示 C FOLDER C FOLDER FILE1 TXT C FOLDER FILE2 TXT C FOLDER FOLDER
  • 使用 python 提取网页上的 URL 列表的简单方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我想创建一个简单的网络爬虫来娱乐 我需要网络爬虫来获取一页上所有链接的列表 python 库是否有任何内置函数可以使这变得更容易 感谢任何知识赞赏 这实际上非常简单美丽汤 from B
  • C# 被视为上下文无关语言吗?

    我一直在寻找这个问题 但是这个问题在网上有很多不同的答案MSDN 论坛 有人说 所有计算机语言语法都是上下文无关的 还有人说任何具有空白敏感语法的语言都可能是上下文相关的 因此不是上下文无关的 F 和 Python 会好的明确的答案也许还有
  • 具有不同 base_site.html 的多个管理站点

    我希望有多个管理站点 每个站点都有不同的基本模板 我可以创造admin base site html并将该路径添加到TEMPLATE DIRS在前面 以便base site html优先 但它会覆盖多个管理站点 有没有办法自定义每个管理站点
  • 如何在 R 中保存 data.frame?

    我在 R 中制作了一个不是很大的 data frame 但构建起来需要相当长的时间 我想将它保存为一个文件 然后我可以在 R 中再次打开它吗 有几种方法 一种方法是使用save 保存确切的对象 例如用于数据框foo save foo fil
  • 仅解析大型 JSON 字符串中的一个字段

    我有一个以下格式的 JSON 字符串 foo small vale baz large value bar another large value 如何高效提取foo而忽略其余字段 基本上 我使用 Gson 并定义了一个 精益类 如下所示
  • QWebEngineView 中的 Qt 事件传播

    我有一个名为generate input event 我正在尝试使用此函数来模拟 QWebEngineView 中的按键 def generate input event window id key code modifiers low l