Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么QKeyPress事件不';没有窗户就不能工作?_Python_Qt_Pyqt_Pyqt5 - Fatal编程技术网

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,那么您可能需要看看。

谢谢!已完成使用此库处理键盘事件的任务