如何用PyQt5做一个模拟键盘,我想让它失去焦点的时候按下按键仍能显示键盘键位?

用PyQt5做一个模拟键盘,我想让它失去焦点的时候按下按键仍能显示键盘键位

img


应该怎么做呢?现在一点击这个软件的外部就失效了

不知道你这个问题是否已经解决, 如果还没有解决的话:

  • 以下回答来自chatgpt:

    对于优化后的问题,我建议可以给模拟键盘组件添加失去焦点仍能显示键盘键位的功能,同时解决点击模拟键盘外部时软件失效的问题。具体操作如下:

    1. 对于模拟键盘组件,考虑重写其focusOutEvent函数,使其在失去焦点后仍能保留当前按键位的信息。代码示例如下:
    class MyKeyboard(QWidget):
        def __init__(self):
            super().__init__()
            self.key_pressed = None
    
        # 重写focusOutEvent函数,保存当前按键位的信息
        def focusOutEvent(self, event):
            self.key_pressed = None
            super().focusOutEvent(event)
    
        # 重写keyPressEvent函数,记录当前按键位的信息
        def keyPressEvent(self, event):
            key = event.key()
            self.key_pressed = key
            super().keyPressEvent(event)
    
        # 重写paintEvent函数,显示按键位的信息
        def paintEvent(self, event):
            painter = QPainter(self)
            painter.setPen(QPen(Qt.black))
            painter.setFont(QFont('Arial', 12))
            if self.key_pressed is not None:
                key_text = QKeySequence(self.key_pressed).toString()
                painter.drawText(self.rect(), Qt.AlignCenter, key_text)
    
    1. 为了防止在点击模拟键盘外部时导致软件失效,可以在主界面中监听鼠标事件,当发现鼠标点击事件不在模拟键盘的区域内时,将焦点转移至主窗口。代码示例如下:
    class MainWindow(QMainWindow):
        def __init__(self):
            ...
            self.keyboard = MyKeyboard()
            self.setCentralWidget(self.keyboard)
    
        # 重写mousePressEvent函数,判断是否在模拟键盘的区域内,若不在则将焦点转移至主窗口
        def mousePressEvent(self, event):
            if not self.keyboard.rect().contains(event.pos()):
                self.setFocus()
            super().mousePressEvent(event)
    

    通过以上操作,就可以实现在失去焦点后仍能显示键盘键位的模拟键盘功能,并解决点击模拟键盘外部时软件失效的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^