gpt4 book ai didi

qt - 如何在 QWebView/QWebPage 中获取焦点元素?

转载 作者:行者123 更新时间:2023-12-04 21:15:18 24 4
gpt4 key购买 nike

我需要能够对 QWebPage 中的焦点变化使用react。我使用了 microFocusChanged() 信号,它给了我几乎理想的行为,但无论如何我不知道如何知道选择了哪个元素。当页面上的任何可编辑元素获得或失去焦点时,我想执行一些操作。

提前致谢

最佳答案

要处理页面中的任何 HTML 事件,您可以执行以下操作:

  1. 创建带有回调槽的 QObject 来接收事件。它可能是一些专用的处理程序对象或现有对象,例如您的 QDialog/QMainWindow。
  2. 使用 QWebFrame.addToJavaScriptWindowObject(name, object) 注册用于 JavaScript 访问的 QObject。
  3. 编写 JavaScript 以添加 HTML 事件处理程序来调用您注册的 QObject 的回调槽。

添加焦点更改处理程序的 JavaScript 应该遍历所有文本元素并添加 onfocus 和 onblur 处理程序。更好的方法是将单个处理程序添加到 documentElement 并使用事件冒泡。不幸的是,onblur ad onfocus 不冒泡。幸运的是,他们有一个冒泡的对应物,称为 DOMFocusIn 和 DOMFocusOut。

下面是捕获页面文本元素的焦点入/出事件的完整示例。它在主窗口上声明了两个插槽 handleFocusInhandleFocusOut 以供 JavaScript 调用,并将主窗口注册为名为 MainWindow 的全局 JavaScript 变量。然后运行 ​​JavaScript 将 DOMFocusIn/DOMFocusOut 事件绑定(bind)到这些插槽(间接地,因为我们需要过滤掉非文本元素)。

import sip
sip.setapi("QString", 2)
sip.setapi("QVariant", 2)
from PyQt4 import QtCore, QtGui, QtWebKit

class MyDialog(QtGui.QMainWindow):

def __init__(self):
super(MyDialog, self).__init__()
self.setWindowTitle("QWebView JavaScript Events")

web_view = QtWebKit.QWebView(self)
web_view.setHtml("""
<html>
<body>
<input type="text" name="text1"/><br/>
<input type="text" name="text2"/><br/>
<input type="submit" value="OK"/>
</body>
</html>""")
self.setCentralWidget(web_view)

main_frame = web_view.page().mainFrame()
main_frame.addToJavaScriptWindowObject("MainWindow", self)

doc_element = main_frame.documentElement()
doc_element.evaluateJavaScript("""
function isTextElement(el) {
return el.tagName == "INPUT" && el.type == "text";
}
this.addEventListener("DOMFocusIn", function(e) {
if (isTextElement(e.target)) {
MainWindow.handleFocusIn(e.target.name);
}
}, false);
this.addEventListener("DOMFocusOut", function(e) {
if (isTextElement(e.target)) {
MainWindow.handleFocusOut(e.target.name);
}
}, false)
""")

self.resize(300, 150)

@QtCore.pyqtSlot(QtCore.QVariant)
def handleFocusIn(self, element_name):
QtGui.QMessageBox.information(
self, "HTML Event", "Focus In: " + element_name)

@QtCore.pyqtSlot(QtCore.QVariant)
def handleFocusOut(self, element_name):
QtGui.QMessageBox.information(
self, "HTML Event", "Focus Out: " + element_name)


app = QtGui.QApplication([])
dialog = MyDialog()
dialog.show()
app.exec_()

(如果您真的不懂 Python,我可能会用 C++ 重写)。

关于qt - 如何在 QWebView/QWebPage 中获取焦点元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2843998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com