내 자신의 "가상 키보드"가 있습니다. KeyEvents에 클릭 된 버튼을 변환하여 QTextEdit 등에 전달해야합니다. 이제 내 문제는 QWebEngineView 내부의 쓰기 가능한 영역에 대해 동일한 작업을 수행하려고한다는 것입니다.QWebEngineView,보기 내부에 KeyEvents 게시
예를 들어 키보드를 사용하여 QLineEdit을 편집하고 웹 사이트를 요청합니다. DONE
내가 구글을 요청했다고 가정 해 봅시다. 이제는 Google 웹 사이트가 바로 앞에 있습니다. 나는 검색 상자의에 내 키보드에서 KeyEvents를 보낼 필요가 (내 QWebEngineView 안에 상자를
이의 지금은 몇 가지 점을 지적하자..
- 나는대로 PyQt5
- 을 사용하고를 읽은 '의 API는 부모가 corect 곳으로의 KeyEvent를 소비한다하다고 나에게 말한다. here
- 이 조각은 말한다 "는 QtWebKit에 가능했다처럼 ...."
- 더 이상 QtWebKit이 없으므로 Chromium을 보았습니다.이 예 내 QEditText 무엇이든지에 KeyEvents를 시뮬레이션하기 위해 내가 가진 무엇
.. (어쩌면 내가 이러한 이벤트를 게시받지 못했습니다 이유입니다)
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"에 대해 설정됩니다.
나는 같은 말을 그냥 시도 : 대신 QWebEngineViews focusProxy에 이벤트를 보낼 때
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)
Mannnnnn을, 나는 경우 백만 달러가 있었는데 지금 당장 줄거야! 예수 그리스도, 당신이 그것을 알아 내려고 노력하면서 얼마나 두려운 지 잘 모를 것입니다. 끔찍한 일들을 시도하고 그렇게 단순하지 않은 것 !!! 완벽하게 작동했습니다! 이 "QCoreApplication.postEvent (self .__ receiver, event)"에 대해이 줄 "self.web_view.keyPressEvent (event)"를 변경해야했습니다. – yurisnm
KeyPressEvent를 통해 보호 된 메서드에 액세스 할 수 없습니다. 그래서 전에 말했듯이 QCoreApplication.postEvent를 통해 게시해야했습니다. :디 – yurisnm