QWebEngineView, опубликуйте KeyEvents внутри View
У меня есть своя "виртуальная клавиатура". Я уже получил возможность преобразовывать кнопки, нажатые в KeyEvents, и передавать их в QTextEdit и так далее. Моя проблема сейчас в том, что я хочу сделать то же самое для областей с возможностью записи внутри QWebEngineView.
Например, я использую клавиатуру для редактирования своего QLineEdit и запрашиваю веб-сайт. СДЕЛАННЫЙ
Допустим, я запросил Google. Теперь у меня есть сайт Google прямо передо мной. Мне нужно отправить KeyEvents с клавиатуры на ее окно поиска (поле, которое находится внутри моего QWebEngineView.
Давайте теперь укажем несколько моментов:
- Я использую PyQt5
- Как я уже читал, API говорит мне, что его родитель должен использовать KeyEvent до основного места. Вот
- В этом фрагменте написано "... как это было возможно с QtWebKit".
- Теперь я видел, что больше нет 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)