2016-11-10 5 views
1

私は自分の "仮想キーボード"を持っています。私は既にKeyEventsにクリックされたボタンを変換してQTextEditなどに渡す必要があります。私の問題は、QWebEngineView内の書き込み可能な領域で同じことをしたいということです。QWebEngineView、ビュー内にKeyEventsを投稿

たとえば、キーボードを使用してQLineEditを編集し、ウェブサイトをリクエストします。 DONE

Googleがリクエストしたとします。今私は私の前にGoogleのウェブサイトを持っています。 。私は私のQWebEngineView内部にあるボックス(検索ボックスのITへの私のキーボードからのキーイベントを送信する必要が

のは、今いくつかのポイント指してみましょう:私は私のようPyQt5

  • を使用しています

    1. を「APIは、それは親がcorect場所へのKeyEventを消費する必要がありますことを私に言って、読みまし。here
    2. このスニペットが言う 『...それはQtWebKitで可能だったように。』
    3. QtWebKitがなくなったので、代わりにChromiumが表示されています。これは、例えば、私のQEditTextと何にキーイベントをシミュレートするために私が持っているものである

    ...(たぶんそれは私がこれらのイベントを投稿する届かない理由です)

    from PyQt5.QtCore import QCoreApplication 
    from PyQt5.QtCore import QEvent 
    from PyQt5.QtCore import QSize 
    from PyQt5.QtCore import Qt 
    from PyQt5.QtGui import QIcon 
    from PyQt5.QtGui import QKeyEvent 
    from PyQt5.QtGui import QPixmap 
    from PyQt5.QtWidgets import QPushButton 
    
    
    class KeyboardKey(QPushButton): 
    
        __path = "" 
    
        __size = [30, 30] 
        __style = "" 
        __icon_on = "" 
        __icon_off = "" 
        __auto_repeat = True 
        __receiver = None 
        __key = None 
        __str_key = None 
    
        def __init__(self, style, str_icon_on, str_icon_off, auto_repeat, size, receiver, key, str_key): 
         super(KeyboardKey, self).__init__() 
         self.__size = size 
         self.__style = style 
         self.__icon_on = str_icon_on 
         self.__icon_off = str_icon_off 
         self.__auto_repeat = auto_repeat 
         self.__receiver = receiver 
         self.__key = key 
         self.__str_key = str_key 
         self.set_up_button(style, str_icon_on, str_icon_off, auto_repeat, size, receiver, key, str_key) 
    
        def set_up_button(self, style, str_icon_on, str_icon_off, auto_repeat, size, receiver, key, str_key): 
         self.__size = size 
         self.__style = style 
         self.__icon_on = str_icon_on 
         self.__icon_off = str_icon_off 
         self.__auto_repeat = auto_repeat 
         self.__receiver = receiver 
         self.__key = key 
         self.__str_key = str_key 
         self.setText(str_key) 
    
         self.setFixedSize(size[0], size[1]) 
         self.setStyleSheet(style) 
         self.setIconSize(QSize(size[0], size[1])) 
         self.setIcon(QIcon(self.__path + str_icon_off + ".png")) 
         self.setAutoRepeat(auto_repeat) 
         pixmap = QPixmap(self.__path + str_icon_off + ".png") 
         self.setMask(pixmap.mask()) 
         self.pressed.connect(self.key_pressed) 
         self.released.connect(self.key_released) 
    
        def set_receiver(self, receiver): 
         self.__receiver = receiver 
    
        def key_pressed(self): 
         self.setStyleSheet(""" 
              border-width: 5px; 
              border-color: rgb(37,43,52); 
              color: white; 
              background-color: rgb(0,187,255); 
             """,) 
    
        def key_released(self): 
         event = QKeyEvent(QEvent.KeyPress, Qt.Key_A, Qt.NoModifier, 
              "a", False) 
         # self.__receiver is my QEditText/QLineEdit/... 
         self.__receiver.keyPressEvent(event) 
    

    この最後の部分は私が自分のイベントを "self .__ receiver"に投稿する部分です。この受信機は、常にそれを呼び出す「QWidget」のために設定されます。

    私はちょうど何か言うことを試みている:あなたの代わりにQWebEngineViews focusProxyにイベントを送信するときにこれは動作するはず

    def key_released(self): 
        event = QKeyEvent(QEvent.KeyPress, Qt.Key_A, Qt.NoModifier, 
             "a", False) 
        # web_view is my QWebEngineView... but it won't consume. Or maybe it's not consuming to the right place. 
        self.web_view.keyPressEvent(event) 
    
  • 答えて

    3

    を - このような何かが動作するはずです:

    recipient = self.web_view.focusProxy() 
    QApplication.postEvent(recipient, event) 
    
    +0

    Mannnnnnを、I場合100万ドルを持っていた、私は今あなたにそれを与えるだろう!イエス・キリスト、私はそれを理解しようと私の脳をどのくらい壊したか分かりません。試してみたら、そんなに簡単なことじゃない!完璧に!この "QCoreApplication.postEvent(self .__ receiver、event)"のために、この行 "self.web_view.keyPressEvent(event)"を変更しなければなりませんでした。 – yurisnm

    +0

    KeyPressEventを通じて、私は保護されたメソッドにアクセスすることができません。以前と同じようにQCoreApplication.postEventをポストしなければなりませんでした。 :D – yurisnm