【问题标题】:Why QKeyPress event don't work without window?为什么 QKeyPress 事件在没有窗口的情况下不起作用?
【发布时间】:2017-03-11 09:31:37
【问题描述】:

如果我添加这个功能:

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_()

一切正常,但是这个 KeyPressevent 仅在我有窗口时才有效,但我不需要窗口,我希望在没有它的情况下处理键盘事件。我尝试这样做:

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_0 print() 将仅打印 Key_0 按钮。 为什么会这样?

【问题讨论】:

    标签: python qt pyqt pyqt5


    【解决方案1】:

    在您的工作代码中,keyPressEventMainWindow 的成员,而QMainWindow 又继承自QMainWindow。由于继承,Qt 框架知道如何将事件分派给MainWindow 的实例,因此keyPressEvent 将按预期被调用。

    在失败的代码中,Frame 不会以任何方式从QWidget 继承(或任何与此相关的东西)。因此,Frame 的任何实例基本上独立于 Qt,因此不会向其发布任何事件。

    关于你的第二个问题...

    如果我将 if 语句更改为 if event.key() == Qt.Key_0 print() 将 仅打印 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,您可能需要查看 python curses

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多