Почему QKeyEvent не работает без окна? Eсли я добавляю йункцию отлавливающую нажатие кнопки на клавиатуре:def keyPressEvent(self, event):
if type(event) == QKeyEvent:
if event.key() == Qt.Key_0 or Qt.Key_1:
print('Key was pressed')
В этот кусок кода :def distance(x1, y1, x2, y2):
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
class Frame:
def __init__(self, position, time):
self.position = position
self.time = time
def speed(self, frame):
d = distance(*self.position, *frame.position)
time_delta = abs(frame.time - self.time)
return d / time_delta
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.last_frame = None
self.setMouseTracking(True)
def mouseMoveEvent(self, event):
nowTime = datetime.now()
mouseWasMoveAt = nowTime.strftime('%H:%M:%S')
new_frame = Frame((event.x(), event.y()), time.time())
if self.last_frame:
print(new_frame.speed(self.last_frame), mouseWasMoveAt ) #print speed and time
self.last_frame = new_frame
def keyPressEvent(self, event):
if type(event) == QKeyEvent:
if event.key() == Qt.Key_0 or Qt.Key_1:
print('Key was pressed')
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.resize(900,600)
w.show()
app.exec_()
Все работает хорошо, выводится все что я хочу, но если я хочу то же самое, но без создания окошка, то ничего не работает, ниже код без окна:class Frame:
def __init__(self, position, time):
self.position = position
self.time = time
def speed(self, frame):
d = distance(*self.position, *frame.position)
time_delta = abs(frame.time - self.time)
return d / time_delta
def keyPressEvent(self, event):
if type(event) == QKeyEvent:
if event.key() == Qt.Key_0 or Qt.Key_1:
print('Key was pressed')
def distance(x1, y1, x2, y2):
return math.sqrt((x2 - x1)**2 + (y2-y1)**2)
def get_current_cursor_position():
pos = QCursor.pos()
return pos.x(), pos.y()
def get_current_frame():
return Frame(get_current_cursor_position(), time.time())
if __name__ == '__main__':
app = QApplication(sys.argv)
last_frame = get_current_frame()
while True:
nowTime = datetime.now()
mouseWasMoveAt = nowTime.strftime('%Y-%m-%d %H:%M:%S')
new_frame = get_current_frame()
if new_frame.speed(last_frame) != 0:
print(mouseWasMoveAt)
last_frame = new_frame
time.sleep(0.07)
Вот, этот кусок кода не работает, как это можно поправить, может я вообще все нитак сделал? И второй вопрос: если я пишу отслеживание нажатий так:def keyPressEvent(self, event):
if type(event) == QKeyEvent:
if event.key() == Qt.Key_0 or Qt.Key_1:
print('Key was pressed')
print() пишет мне любую клавишу какую бы я не нажал, если я меняю if event.key() == Qt.Key_0 print() напиште только Key_0 . Почему так?

21 Авг 2019 в 06:31
201 +1
0
Ответы
1

QKeyEvent не работает без окна, потому что QKeyEvent является событием, связанным с виджетом. Без окна или виджета QKeyEvent не будет генерироваться.

В вашем втором примере, вы пытаетесь использовать keyPressEvent вне класса, что не будет работать. Метод keyPressEvent должен быть внутри класса виджета, чтобы он мог обрабатывать события нажатия клавиш.

Касательно вашего вопроса о том, почему срабатывает условие if event.key() == Qt.Key_0 or Qt.Key_1 при нажатии любой клавиши, это связано с тем, что условие написано некорректно. Корректный способ сравнения значения ключа должен быть таким:

if event.key() == Qt.Key_0 or event.key() == Qt.Key_1:

В этом случае условие сработает только при нажатии клавиши Key_0 или Key_1.

20 Апр в 13:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 622 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир