【问题标题】:Can I disable/delete class in PyQt5 (i.e. QEvent.KeyPress)?我可以禁用/删除 PyQt5 中的类(即 QEvent.KeyPress)吗?
【发布时间】:2020-09-17 06:46:12
【问题描述】:

我正在开发基于 PyQt5 的应用程序。我的 GUI 显示 21 个按钮:从 A 到 Z 的字母,我用它们作为输入

主要算法。我也希望能够从键盘输入字母。

到目前为止,Get printable name of any QKeyEvent key value 我能够做到这一点。

唯一的问题是如何禁用 keyPressevent ,并在我的应用介绍屏幕后重新启用它,

就像我对字母按钮所做的那样:

self.groupBox.hide() 并在按下开始新游戏后重新启用它们

按钮。 self.groupBox.show()

我在我的回答中写下了由 musicamante 提供的我的问题的解决方案。我现在仍然想知道是否有办法以我的方式禁用 PyQt5 键盘事件处理:

def keyPressEvent(self, event):
         print(keyevent_to_string(self, event))
         print('self.letters : ',self.letters)
         print('self.letters_guessed : ',self.letters_guessed )
         if keyevent_to_string(self, event) in self.letters:
                    print('inininininini'*5)
                    self.printo(keyevent_to_string(self, event))

代码片段在那里,但当我按下键盘键时不会产生任何结果?

我知道 KeyPressEvent 是 QEvent.KeyPress 的处理程序,那么有没有办法在 Pyqt5 中禁用/删除/删除 QEvent.KeyPress 类?

【问题讨论】:

  • 你不能只用一个变量来设置“监控”状态,然后不管变量是否设置对关键事件做出反应吗?无论如何,如果您向我们提供minimal, reproducible example,它可能有助于更好地了解您想要实现的目标。
  • 你最好使用 self.button.setEnable(False)
  • self.button.setEnable(False) ,我在按下其中一个按钮后这样做,我使用 hide() 隐藏我的键盘
  • 嗨musicamante,非常感谢你的建议,我就是这么做的

标签: python-3.x pyqt5 built-in


【解决方案1】:

按照我修改代码的musicamante建议:

def keyPressEvent(self, event):
    if self.keyonoff:
         print(keyevent_to_string(self, event))
         print('self.letters : ',self.letters)
         print('self.letters_guessed : ',self.letters_guessed )
         if keyevent_to_string(self, event) in self.letters:
                    print('inininininini'*5)
                    self.printo(keyevent_to_string(self, event))

然后切换

self.keyonoff = Trueself.keyonoff = False

根据我的代码的需要。

我得到了我正在寻找的东西,不确定是否有其他方法可以 这样做:'我知道 KeyPressEvent 是 QEvent.KeyPress 的处理程序,所以有没有办法在 Pyqt5 中禁用/删除/删除 QEvent.KeyPress 类?'

下面的代码不是我的,只是对我的目的有用的 keyPressEvent 重新植入

from PyQt5.QtCore import Qt

def keyevent_to_string(self, event):
    self.keymap = {}
    for self.key, value in vars(Qt).items():
        if isinstance(value, Qt.Key):
            self.keymap[value] = self.key.partition('_')[2]

    self.modmap = {
        Qt.ControlModifier: self.keymap[Qt.Key_Control],
        Qt.AltModifier: self.keymap[Qt.Key_Alt],
        Qt.ShiftModifier: self.keymap[Qt.Key_Shift],
        Qt.MetaModifier: self.keymap[Qt.Key_Meta],
        Qt.GroupSwitchModifier: self.keymap[Qt.Key_AltGr],
        Qt.KeypadModifier: self.keymap[Qt.Key_NumLock],
        }
    self.sequence = []
    for modifier, text in self.modmap.items():
        if event.modifiers() & modifier:
            self.sequence.append(text)
    self.key = self.keymap.get(event.key(), event.text())
    if self.key not in self.sequence:
        self.sequence.append(self.key)
    return '+'.join(self.sequence)

来自Get printable name of any QKeyEvent key value

编辑编辑编辑编辑

希望我能获得更多关于这方面的信息:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri May 29 10:49:58 2020

@author: Pietro
"""

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt, QEvent

class Window(QtWidgets.QMainWindow):    
    def __init__(self):
        super(Window, self).__init__()
        self.button = QtWidgets.QPushButton("activate", self)
        self.button2 = QtWidgets.QPushButton("deactivate", self)
        self.button.move(0,0)
        self.button2.move(100,100)
        self.button2.clicked.connect(self.deactivated)
        self.button.clicked.connect(self.activated)

    def activated(self):
        print('attivato')
        QWidget.setEnabled(self,True)

    def deactivated(self):
        print('deattivato')
        QWidget.setEnabled(self,False)

    def keyevent_to_string(self, event):
        self.keymap = {}
        for self.key, value in vars(Qt).items():
            if isinstance(value, Qt.Key):
                self.keymap[value] = self.key.partition('_')[2]

        self.modmap = {
            Qt.ControlModifier: self.keymap[Qt.Key_Control],
            Qt.AltModifier: self.keymap[Qt.Key_Alt],
            Qt.ShiftModifier: self.keymap[Qt.Key_Shift],
            Qt.MetaModifier: self.keymap[Qt.Key_Meta],
            Qt.GroupSwitchModifier: self.keymap[Qt.Key_AltGr],
            Qt.KeypadModifier: self.keymap[Qt.Key_NumLock],
            }
        self.sequence = []
        for modifier, text in self.modmap.items():
            if event.modifiers() & modifier:
                self.sequence.append(text)
        self.key = self.keymap.get(event.key(), event.text())
        if self.key not in self.sequence:
            self.sequence.append(self.key)
        return '+'.join(self.sequence)

    def keyPressEvent(self, event):
            print(self.keyevent_to_string(event))

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

我终于来了

QWidget.setEnabled(False)

显然禁用键盘和鼠标事件。知道如何仅禁用键盘事件吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2012-09-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多