Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QWebEngineView中的Qt事件传播_Python_Pyqt_Pyqt5_Qtwebengine_Qwebengineview - Fatal编程技术网

Python QWebEngineView中的Qt事件传播

Python QWebEngineView中的Qt事件传播,python,pyqt,pyqt5,qtwebengine,qwebengineview,Python,Pyqt,Pyqt5,Qtwebengine,Qwebengineview,我有一个名为generate\u input\u event的函数。我试图使用此函数模拟QWebEngineView中的按键 def生成输入事件(窗口id、键代码、修改器、低级别数据、x、y): 修饰符\标志=创建\修饰符\标志(修饰符) info(“生成输入,窗口:{}代码:{},修饰符{}”。格式( 窗口(id、键(代码、修改器(标志)) 事件=QKeyEvent(QEvent.KeyPress、键代码、修饰符标志) event.artificial=True 事件窗口=窗口。获取窗口(窗口

我有一个名为
generate\u input\u event
的函数。我试图使用此函数模拟QWebEngineView中的按键

def生成输入事件(窗口id、键代码、修改器、低级别数据、x、y):
修饰符\标志=创建\修饰符\标志(修饰符)
info(“生成输入,窗口:{}代码:{},修饰符{}”。格式(
窗口(id、键(代码、修改器(标志))
事件=QKeyEvent(QEvent.KeyPress、键代码、修饰符标志)
event.artificial=True
事件窗口=窗口。获取窗口(窗口id)
QCoreApplication.sendEvent(event_window.qtwindow,event)
每当我运行程序并突出显示QWebEngineView中的输入字段,并调用
generate_input_event
时,它都会将该字母键入输入字段

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

类事件过滤器(QWidget):
def uuu init uuu(self,parent=None):
超级(事件筛选器,自身)。\uuuu初始化\uuuuu(父级)
qApp.installEventFilter(自)
def事件过滤器(自身、obj、事件):
如果(event.type()==QEvent.KeyPress和hasattr(event,“artificial”):
logging.info(“人工事件”)
返回False发送到小部件
elif(event.type()==QEvent.KeyPress and not是_修饰符(event.key()):
修饰符=创建修饰符列表(event.modifiers())
键字符串=创建键字符串(事件)
key\u code=event.key()
info(“发送代码:{}字符串:{}修饰符{}”。格式(
键(代码、键(字符串、修饰符))
返回真值不要转发小部件
返回错误
但是,当我实际运行代码时,我得到的输出如下:

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
INFO:root:send-code:65字符串:a修饰符[“”]
信息:根:生成输入,窗口:1代码:65,修改器
信息:根:人工事件
输出看起来是正确的,但是,QWebEngineView的输入字段实际上从未获得由
generate\u input\u事件
人工生成的字母


另外,如果出于上下文原因,您希望查看整个文件/项目,请查看此处的分支/文件:

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

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

从PyQt5导入QtCore、QtGui、qtwidget、QtWebEngineWidgets
类EventFilter(QtCore.QObject):
def事件过滤器(自身、obj、事件):
如果event.type()==QtCore.QEvent.KeyPress和hasattr(
事件,“人造”
):
打印(“事件:”,event.key(),event.text())
返回错误
return super().eventFilter(对象,事件)
类ForwardKeyEvent(QtCore.QObject):
定义初始化(self、发送方、接收方、父方=无):
超级(ForwardKeyEvent,self)。\uuu初始化\uuuu(父级)
self.m_sender=发送方
self.m_receiver=接收器
self.m_sender.installEventFilter(self)
def事件过滤器(自身、obj、事件):
如果self.m_发送方为obj且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=真
QtCore.QCoreApplication.postEvent(self.m_receiver,new_事件)
return super().eventFilter(对象,事件)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
ef=EventFilter()
app.installEventFilter(ef)
lineedit=qtwidts.QLineEdit()
lineedit.show()
view=QtWebEngineWidgets.QWebEngineView()
查看。调整大小(640480)
view.show()
视图.加载(QtCore.QUrl(“https://www.google.com/"))
#RenderWidgetHostViewQtDelegateWidget是在加载页面后创建的
#因此,必须在load()或setHtml()之后访问它。
render_widget=view.findChild(qtwidts.QWidget)
打印(render_widget.metaObject().className())
断言(呈现小部件)
fe=ForwardKeyEvent(lineedit,render_小部件)
sys.exit(app.exec_())

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

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

从PyQt5导入QtCore、QtGui、qtwidget、QtWebEngineWidgets
类EventFilter(QtCore.QObject):
def事件过滤器(自身、obj、事件):
如果event.type()==QtCore.QEvent.KeyPress和hasattr(
事件,“人造”
):
打印(“事件:”,event.key(),event.text())
返回错误
return super().eventFilter(对象,事件)
类ForwardKeyEvent(QtCore.QObject):
定义初始化(self、发送方、接收方、父方=无):
超级(ForwardKeyEvent,self)。\uuu初始化\uuuu(父级)
self.m_sender=发送方
self.m_receiver=接收器
self.m_sender.installEventFilter(self)
def事件过滤器(自身、obj、事件):
如果self.m_发送方为obj且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=真
QtCore.QCoreApplication.postEvent(self.m_receiver,new_事件)
返回super().eventF