Pyqtgraph:在哪里可以找到按键信号?

Posted

技术标签:

【中文标题】Pyqtgraph:在哪里可以找到按键信号?【英文标题】:Pyqtgraph: where to find signal for key preses? 【发布时间】:2017-03-18 08:46:43 【问题描述】:

以下示例显示如何将任意可调用的 Python 连接到 GraphicsWindow 中的鼠标运动事件。你会如何对按键事件做同样的事情?

from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

app = pg.mkQApp()
win = pg.GraphicsWindow()
pl = win.addPlot()
pl.plot([x*x for x in range(-10,11)])

def mouseMoved(evt):
    print("Mouse moved event: ".format(evt))

pl.scene().sigMouseMoved.connect(mouseMoved)

def keyPressed(evt):
    print("Key pressed")

# The scene doesn't have an equivalent signal for key presses
# pl.scene().sigKeyPressed.connect(keyPress)

app.exec_()

【问题讨论】:

【参考方案1】:

尽管这个问题被问到已经有一段时间了, 我仍然希望我的回答有所帮助。

解决办法是从pyqtgraph.GraphicsWindow派生一个类,然后定义一个按键信号。

from pyqtgraph.Qt import QtCore
import pyqtgraph as pg

class KeyPressWindow(pg.GraphicsWindow):
    sigKeyPress = QtCore.pyqtSignal(object)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def keyPressEvent(self, ev):
        self.scene().keyPressEvent(ev)
        self.sigKeyPress.emit(ev)


def keyPressed(evt):
    print("Key pressed")


app = pg.mkQApp()
win = KeyPressWindow()
win.sigKeyPress.connect(keyPressed)
pl = win.addPlot()
pl.plot([x*x for x in range(-10,11)])


app.exec_()

【讨论】:

【参考方案2】:

对@user1513370 的回答的小幅更新/增强。

我已将已弃用的 pg.GraphicsWindow 替换为 pg.GraphicsLayoutWidget,删除了对 __init__ 的冗余调用,并添加了从 keycodes defined in the Qt namespace 到键名的映射。

from pyqtgraph.Qt import QtCore
import pyqtgraph as pg
from collections import defaultdict

# Get key mappings from Qt namespace
qt_keys = (
    (getattr(QtCore.Qt, attr), attr[4:])
    for attr in dir(QtCore.Qt)
    if attr.startswith("Key_")
)
keys_mapping = defaultdict(lambda: "unknown", qt_keys)

class KeyPressWindow(pg.GraphicsLayoutWidget):
    sigKeyPress = QtCore.pyqtSignal(object)

    def keyPressEvent(self, ev):
        self.scene().keyPressEvent(ev)
        self.sigKeyPress.emit(ev)


app = pg.mkQApp()
win = KeyPressWindow(show=True)
win.sigKeyPress.connect(lambda event: print(keys_mapping[event.key()]))
win.addPlot().plot([x*x for x in range(-10,11)])

app.exec()

【讨论】:

以上是关于Pyqtgraph:在哪里可以找到按键信号?的主要内容,如果未能解决你的问题,请参考以下文章

合并两个词典相同的按键[复制]

手机虚拟按键怎么设置

Android系统定制-SystemUI-控制下拉状态栏快捷设置的下拉与关闭(通过按键控制)

Android系统定制-SystemUI-控制下拉状态栏快捷设置的下拉与关闭(通过按键控制)

按键精灵 大漠插件后台 找字点击的时候总是一点击就点到前台?

按键信号的边沿检测