Почему 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
242 +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 Апр 2024 в 13:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир