質問

がある対応はフォーカスの変更QWebPage.使用したmicroFocusChanged()信号が与えてくださいほど望ましい行動がとにかくわからないどの要素を選択します。たいいくつかの行動が他の編集可能な要素のページを得または喪失す。

よろしくお願いし

役に立ちましたか?

解決

対応HTMLのイベント内のページにおいては、以下の

  1. をQObjectとのコールバックスロットを受ける舞いを申し上げます。でするように設計されている専用ハンドラのオブジェクトまたは既存のオブジェクトのようにおQDialog/QMainWindow.
  2. 登録したQObject JavaScriptでアクセスQWebFrame.addToJavaScriptWindowObject(お名前、オブジェクト
  3. 書webブラウザでJavaScriptの実行を追加HTMLイベントハンドラを呼び出すご登録のQObjectのコールバックいただけます。

WebブラウザでJavaScriptの実行を追加プラットフォームにハンドラはトラバースすべてのテキストの要素を追加onfocusとonblurハンドラ.しみいただけるように追加シングルハンドラをdocumentElement用バブリングイベント.残念ながら、onblur ad onfocusなバブルが発生しました。幸いなことに、このバブリングカーというDOMFocusInとDOMFocusOut.

こちらは完全にexamlpeの捕集にイベントページのテキストです。っていくことを宣言し二つのスロット handleFocusInhandleFocusOut メインウィンドウを呼び出すことができるJavaScriptsレジスタやメインウィンドウとしてグローバルなJavaScriptの変数名 MainWindow.に運行してwebブラウザでJavaScriptの実行を結合するDOMFocusIn/DOMFocusOutイベントはこれらのスロット(間接的にしておくことが必要不可欠であるフィルタの出非テキストelemnts).

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_()

い場合に書き換えをC++かできな姿Python).

他のヒント

また、同じ問題がなかったためにJavascriptを使用したかったのでしっとjavascriptを無効に QWebSettings.については基本的に考えることができる二つのアプローチ:

  • を聞き microFocusChanged 信号とを示唆してい:

    frame = page.currentFrame()
    elem = frame.findFirstElement('input:not([type=hidden]):focus textarea:focus')
    if not elem.isNull():
        logging.debug("Clicked editable element!")
    

    このコースは天井が microFocusChanged 放射複数回、多くの場合だけでなく、場合には入力欄選択した例選択することが可能です。

    きれいでしょう意味に loadFinished な要素が自動焦点が絞られています。

    まだ試こだてプロジェクトを実施する。

  • まだけmouseclicks、 mousePressEventhitTestContent もコメントありがとうございます

    def mousePressEvent(self, e):
        pos = e.pos()
        frame = self.page().frameAt(pos)
        pos -= frame.geometry().topLeft()
        hitresult = frame.hitTestContent(pos)
        if hitresult.isContentEditable():
            logging.debug("Clicked editable element!")
        return super().mousePressEvent(e)
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top