QSlider 和键盘按键事件

3

我目前有一个QSlider,可以使用鼠标滚动图像数据的帧。 我想能够使用箭头键来滚动单个步骤(一帧)。

这是我当前的sliderMoved代码:

def sliderMoved(self,val):
    """
    retrieves the data array for the index value specified by the slider
    """

    if self.fileheader is None:
        print "[DEBUG] change_image_index(): self.fileheader is None"
        return

    idx=val
    self.x=idx
    frame=self.fileheader.frameAtIndex(idx)
    image=scipy.ndimage.filters.maximum_filter(frame.data, size=5)

    self.image.setImage(image, scale=((10.28/512),(2.486/96)))
    print self.image.imageItem.pixelSize()

    def keyPressEvent(self, event):
        if event.key()==Qt.Key_Right:
            frame=self.fileheader.frameAtIndex(idx+1)

为了将滑块连接到事件,我只需要使用:

self.slider.sliderMoved.connect(self.sliderMoved)
self.slider.sliderMoved.connect(self.keyPressEvent)

箭头键移动滑块,但不会导致图像跳帧...我知道我错过了一些愚蠢的东西...
2个回答

7
尝试连接到滑块的valueChanged而不是sliderMoved
import sys
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication, QWidget, QSlider, QLabel, QVBoxLayout

class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.v_layout = QVBoxLayout()

        self.slider = QSlider()
        self.slider.setOrientation(Qt.Horizontal)
        self.label = QLabel('Slider at position 0')

        self.v_layout.addWidget(self.label)
        self.v_layout.addWidget(self.slider)

        self.setLayout(self.v_layout)

        self.slider.valueChanged.connect(self.slider_moved)

    def keyPressEvent(self, event):
        if event.key()==Qt.Key_Right:
            self.slider.setValue(self.slider.value() + 1)
        elif event.key()==Qt.Key_Left:
            self.slider.setValue(self.slider.value() - 1)
        else:
            QWidget.keyPressEvent(self, event)

    def slider_moved(self, position):
        self.label.setText('Slider at position %d' % position)


if __name__ == '__main__':
  app = QApplication(sys.argv)

  widget = Widget()
  widget.show()

  sys.exit(app.exec_())

在您的 keyPressEvent 中,您只需更改滑块的值,这将导致与 valueChanged 相连接的任何函数运行。


0

更新一下。任何 matplotlib 图形都可以连接到按键事件,根据按下的键,绘制的数据可以变化。我分享了一个简单的例子,如果从键盘上按下 'x' 键,则 matplotlib 图形的 xlabel 不会显示。对此脚本进行简单修改,可以推广到更大的实用性。该示例取自以下链接: https://matplotlib.org/stable/gallery/event_handling/keypress_demo.html

import sys
import numpy as np
import matplotlib.pyplot as plt


def on_press(event):
    print('press', event.key)
    sys.stdout.flush()
    if event.key == 'x':
        visible = xl.get_visible()
        xl.set_visible(not visible)
        fig.canvas.draw()


# Fixing random state for reproducibility
np.random.seed(19680801)

fig, ax = plt.subplots()

fig.canvas.mpl_connect('key_press_event', on_press)

ax.plot(np.random.rand(12), np.random.rand(12), 'go')
xl = ax.set_xlabel('easy come, easy go')
ax.set_title('Press a key')
plt.show()

尽管此链接可能回答了问题,但最好在此处包含答案的关键部分并提供参考链接。如果链接页面更改,仅包含链接的答案可能会变得无效。-【来自审核】 - Emi OB
@EmiOB 我在这里添加了一个小例子,以便更容易理解用法。我无法对这个特定的问题进行完全具体的回答,因为我的问题不完全相同。然而,该问题及其被接受的答案帮助我找到了解决我的问题的链接,因此我认为我应该在这里提及它,以防其他人也需要它。希望这足够了解。 - Pratik Dash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接