2016-11-10 15 views
1

내 자신의 "가상 키보드"가 있습니다. KeyEvents에 클릭 된 버튼을 변환하여 QTextEdit 등에 전달해야합니다. 이제 내 문제는 QWebEngineView 내부의 쓰기 가능한 영역에 대해 동일한 작업을 수행하려고한다는 것입니다.QWebEngineView,보기 내부에 KeyEvents 게시

예를 들어 키보드를 사용하여 QLineEdit을 편집하고 웹 사이트를 요청합니다. DONE

내가 구글을 요청했다고 가정 해 봅시다. 이제는 Google 웹 사이트가 바로 앞에 있습니다. 나는 검색 상자의에 내 키보드에서 KeyEvents를 보낼 필요가 (내 QWebEngineView 안에 상자를

이의 지금은 몇 가지 점을 지적하자..

  1. 나는대로 PyQt5
  2. 을 사용하고를 읽은 '의 API는 부모가 corect 곳으로의 KeyEvent를 소비한다하다고 나에게 말한다. here
  3. 이 조각은 말한다 "는 QtWebKit에 가능했다처럼 ...."
  4. 더 이상 QtWebKit이 없으므로 Chromium을 보았습니다.이 예 내 QEditText 무엇이든지에 KeyEvents를 시뮬레이션하기 위해 내가 가진 무엇

.. (어쩌면 내가 이러한 이벤트를 게시받지 못했습니다 이유입니다)

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을, 나는 경우 백만 달러가 있었는데 지금 당장 줄거야! 예수 그리스도, 당신이 그것을 알아 내려고 노력하면서 얼마나 두려운 지 잘 모를 것입니다. 끔찍한 일들을 시도하고 그렇게 단순하지 않은 것 !!! 완벽하게 작동했습니다! 이 "QCoreApplication.postEvent (self .__ receiver, event)"에 대해이 줄 "self.web_view.keyPressEvent (event)"를 변경해야했습니다. – yurisnm

+0

KeyPressEvent를 통해 보호 된 메서드에 액세스 할 수 없습니다. 그래서 전에 말했듯이 QCoreApplication.postEvent를 통해 게시해야했습니다. :디 – yurisnm