【问题标题】:Pyqtgraph: where to find signal for key preses?Pyqtgraph:在哪里可以找到按键信号?
【发布时间】: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_()

【问题讨论】:

    标签: python pyqtgraph


    【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 2011-08-22
        相关资源
        最近更新 更多