Могу ли я отключить / удалить класс в PyQt5 (например, QEvent.KeyPress)? - PullRequest
0 голосов
/ 29 мая 2020

Я работаю над приложением на основе PyQt5. Мой GUI показывает 21 кнопку: буквы от A до Z, я использую их как ввод для

основного алгоритма. Я бы тоже хотел иметь возможность вводить буквы с клавиатуры.

До сих пор после Получить печатаемое имя любого значения ключа QKeyEvent Я могу этого добиться.

Единственная проблема заключается в том, как отключить keyPressevent и снова включить его после экрана моего приложения,

, как я делаю с моей кнопкой с буквами:

self.groupBox.hide() и повторно активируя их после нажатия начать новую игру

кнопка. с self.groupBox.show()

Я записал в своем ответе решение моей проблемы, предоставленное musicamante. Тем не менее, я хотел бы теперь узнать, есть ли способ отключить обработку событий Keybonard 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, поэтому есть ли способ отключить / удалить / удалить класс QEvent.KeyPress в Pyqt5?

1 Ответ

0 голосов
/ 29 мая 2020

следуя предложениям музыкантов, я изменил свой код с помощью:

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 = True и self.keyonoff = False

, как того требует мой код.

Я получаю то, что искал, не уверен, есть ли другой способ сделать это: «Я понял, что KeyPressEvent является обработчиком QEvent.KeyPress, поэтому есть ли способ отключить / удалить / удалить QEvent. Класс KeyPress в Pyqt5? '

Код ниже не мой, это просто повторная реализация 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)

From Получить печатаемое имя любого значения ключа QKeyEvent

Отредактировано Отредактировано Отредактировано

Надеюсь, подробнее об этом я получу право задавать вопросы:

#!/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)

, по-видимому, отключил события клавиатуры и мыши. Есть идеи, как отключить только события клавиатуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...