私は自分の「仮想キーボード」を持っています。クリックされたボタンを KeyEvents に変換し、それを QTextEdit などに配信する必要があります。私の問題は、QWebEngineView 内の書き込み可能な領域に対して同じことをしたいということです。
たとえば、キーボードを使用して QLineEdit を編集し、Web サイトをリクエストします。終わり
グーグルにリクエストしたとしましょう。今、目の前に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.__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)