有没有办法将QtCore.Qt.Key转换为字符串

问题描述 投票:0回答:1

我通过重写

keyPressEvent()
函数来捕获远程桌面应用程序的键盘事件,如下所示:
    def keyPressEvent(self, event): key = event.key() self.io_soc.send(f'key {key}'.encode())

我想在另一台计算机上模拟键盘事件,但问题是我需要将 event.key() 给出的按键代码转换为字符串,因为 pyautogui.press() 将字符串作为参数。

我没有找到任何方法来获取字符串形式的密钥或将其转换。请给我提供一种进行此转换的方法,或者解决此问题的方法

python pyqt
1个回答
0
投票

要将按键代码转换为 PyQt 中的字符串,请使用 QKeySequence 类,它允许您将按键代码转换为人类可读的文本。这是包含转换的 keyPressEvent 函数的更新版本:

    from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QKeySequence

class RemoteDesktopWidget(QWidget):
    # ... other methods ...

    def keyPressEvent(self, event):
        key_sequence = QKeySequence(event.key())
        key_text = key_sequence.toString()
        
        # This is to ensure that we only send printable characters
        if len(key_text) == 1 or key_text.startswith("Shift+") or key_text.startswith("Ctrl+") or key_text.startswith("Alt+"):
            self.io_soc.send(f'key {key_text}'.encode())

请记住,QKeySequence.toString() 函数可能会生成包含“Ctrl+”、“Alt+”或“Shift+”等修饰符的字符串表示形式。由于 pyautogui.press() 需要单个字符或不带修饰符的键字符串,因此您可能需要独立处理这些场景。 对于不是字符键的键(例如功能键或箭头键),您必须将 Qt.Key 值映射到其 pyautogui 等效键。 PyAutoGUI 要求非字母数字键使用某些字符串(例如“enter”、“f1”、“left”、“right”等)。 这是您可以使用的示例映射函数:

from PyQt5.QtCore import Qt

def convert_key_to_string(key_code):
    key_mappings = {
        Qt.Key_Enter: 'enter',
        Qt.Key_Return: 'enter',
        Qt.Key_Left: 'left',
        Qt.Key_Up: 'up',
        Qt.Key_Right: 'right',
        Qt.Key_Down: 'down',
        # Add other necessary key mappings here
    }
    return key_mappings.get(key_code, None)

# Use it in your keyPressEvent like this:
def keyPressEvent(self, event):
    key_string = convert_key_to_string(event.key())
    if key_string:
        self.io_soc.send(f'key {key_string}'.encode())
    else:
        # Handle regular character keys as shown earlier

此方法,您的 keyPressEvent 函数会将按下的键的字符串表示形式传达给远程系统,然后可以与 pyautogui.press() 一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.