QWebEngineView, post KeyEvents inside the View



我有我自己的"虚拟键盘"。我已经把按钮转换成KeyEvents并把它传递给QTextEdit等等。我现在的问题是,我想在QWebEngineView内做同样的可写区域。

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

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

现在让我们指出几点:

  1. 我使用PyQt5
  2. 正如我所读到的,API告诉我它的父类应该在正确的地方使用KeyEvent。这里的
  3. 这段代码说"…就像QtWebKit一样。"
  4. 我已经看到现在没有更多的QtWebKit,所以铬代替。(也许这就是我不能发布这些事件的原因)

这就是我所拥有的,例如模拟keyeevents到我的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"设置。

我只是试着这样说:

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)

当您将事件发送到QWebEngineViews focusProxy时,这应该可以工作-类似这样的事情应该可以工作:

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

相关内容

  • 没有找到相关文章

最新更新