Python 为什么QKeyPress事件不';没有窗户就不能工作?
如果我添加此函数:Python 为什么QKeyPress事件不';没有窗户就不能工作?,python,qt,pyqt,pyqt5,Python,Qt,Pyqt,Pyqt5,如果我添加此函数: 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
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)
这个代码不起作用,我该怎么办?
另一个问题是:
如果我像这样写keyEvent函数
def keyPressEvent(self, event):
if type(event) == QKeyEvent:
if event.key() == Qt.Key_0 or Qt.Key_1:
print('Key was pressed')
print()将打印我按下的任何键,但如果我将if语句更改为if event.key()==Qt.key\u 0 print()将只打印key\u 0按钮。
为什么会发生这种情况?在您的工作代码中,
keyPressEvent
是main窗口的成员,而main窗口又继承了qmain窗口
。由于继承性,Qt
框架知道如何将事件分派到MainWindow
的实例,因此将按预期调用keyPressEvent
在失败的代码中,帧
不会以任何方式从QWidget
(或任何相关内容)继承。因此,Frame
的任何实例本质上独立于Qt
,因此不会向其发布任何事件
关于你的第二个问题
如果我将if语句更改为if event.key()
仅打印0键按钮。为什么会这样
而不是
if event.key() == Qt.Key_0 or Qt.Key_1:
你可能想要
if event.key() == Qt.Key_0 or event.key() == Qt.Key_1:
如果您想要的是一个使用键盘输入的控制台应用程序,而不是一个完整的GUI,那么您可能需要看看。谢谢!已完成使用此库处理键盘事件的任务