QWebEngineView, опубликуйте KeyEvents внутри View

У меня есть своя "виртуальная клавиатура". Я уже получил возможность преобразовывать кнопки, нажатые в KeyEvents, и передавать их в QTextEdit и так далее. Моя проблема сейчас в том, что я хочу сделать то же самое для областей с возможностью записи внутри QWebEngineView.

Например, я использую клавиатуру для редактирования своего QLineEdit и запрашиваю веб-сайт. СДЕЛАННЫЙ

Допустим, я запросил Google. Теперь у меня есть сайт Google прямо передо мной. Мне нужно отправить KeyEvents с клавиатуры на ее окно поиска (поле, которое находится внутри моего QWebEngineView.

Давайте теперь укажем несколько моментов:

  1. Я использую PyQt5
  2. Как я уже читал, API говорит мне, что его родитель должен использовать KeyEvent до основного места. Вот
  3. В этом фрагменте написано "... как это было возможно с QtWebKit".
  4. Теперь я видел, что больше нет QtWebKit, и поэтому вместо него Chromium. (Может быть, поэтому я не собираюсь публиковать эти события)

Это то, что у меня есть, например, для симуляции 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)

Эта последняя часть - та, которую я публикую на "self.__receiveer". Этот приемник всегда устанавливается для "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 ответ

Решение

Это должно работать, когда вы отправляете события в focu sProxy QWebEngineViews - что-то вроде этого должно работать:

recipient = self.web_view.focusProxy()
QApplication.postEvent(recipient, event)
Другие вопросы по тегам