QWebEngineView,在View中发布KeyEvents

时间:2016-11-10 18:13:07

标签: qt pyqt qevent qkeyevent

我有自己的“虚拟键盘”。我已经转换了点击KeyEvents的按钮并将其传递给QTextEdit,依此类推。我现在的问题是我想对QWebEngineView中的可写区域做同样的事情。

例如,我使用键盘编辑我的QLineEdit,并请求网站。的完成

假设我要求谷歌。现在我的Google网站就在我面前。我需要将KeyEvents从我的键盘发送到它的搜索框。(在我的QWebEngineView中的Box。

现在让我们指出几点:

  1. 我正在使用PyQt5
  2. 正如我所读到的,API告诉我它的父级应该将KeyEvent用于核心位置。 here
  3. 此片段说“......就像使用QtWebKit一样。”
  4. 我现在已经看到没有更多的QtWebKit了,所以Chromium也没有。(也许这就是我没有发布这些事件的原因)
  5. 这就是我的模拟KeyEvents到我的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)
    

    这最后一部分是我在“自我.__接收器”上发布我的事件的部分。此接收器始终设置为调用它的“QWidget”。

    我试图说出类似的话:

    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)
    

1 个答案:

答案 0 :(得分:5)

当您将事件发送到QWebEngineViews focusProxy时,这应该有效 - 这样的事情应该有效:

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