【发布时间】:2019-11-22 11:36:24
【问题描述】:
我有一个名为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
输出看起来正确,但是,QWebEngineView 的输入字段实际上从来没有得到由generate_input_event 人为生成的字母。
附:如果您出于上下文原因希望查看整个文件/项目,请在此处查看此分支/文件:https://github.com/atlas-engineer/next/blob/generate_events/ports/pyqt-webengine/utility.py
【问题讨论】:
-
我不明白你要获取什么,即日志的哪一部分不正确。您还使用未声明的代码采样了 2 个令人困惑的代码。
-
日志没有错。问题是,虽然正在生成一个人为事件,但我实际上并没有看到在我关注的输入字段中输入了一个字母。
-
这是最重要的,你没有指出清楚,我建议你编辑你的问题并指出它。
-
我已经这样做了,如果现在清楚请告诉我。
-
这更好,但它比您在问题开始时期望的信号更好,也就是说:“您想模拟键盘事件,以便文本显示在输入中在 QWebEngineView 中,为此我尝试了 X,但我遇到了问题 Y"
标签: python pyqt pyqt5 qtwebengine qwebengineview