2

私は自分の「仮想キーボード」を持っています。クリックされたボタンを KeyEvents に変換し、それを QTextEdit などに配信する必要があります。私の問題は、QWebEngineView 内の書き込み可能な領域に対して同じことをしたいということです。

たとえば、キーボードを使用して QLineEdit を編集し、Web サイトをリクエストします。終わり

グーグルにリクエストしたとしましょう。今、目の前に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.__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)
4

1 に答える 1