QSlider и событие нажатия клавиши
В настоящее время у меня есть QSlider, который прокручивает кадры данных изображения с помощью мыши. Я хотел бы иметь возможность использовать клавиши со стрелками для прокрутки через один шаг (один кадр).
Это мой текущий код слайдера:
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 ответа
Попробуйте подключиться к слайдеру 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
бежать.
Просто обновление. Любая фигура matplotlib может быть связана с событием нажатия клавиши, а отображаемые данные могут варьироваться в зависимости от нажатой клавиши. Я делюсь простым примером, когда xlabel рисунка matplotlib не отображается, если на клавиатуре нажата клавиша «x». Простые модификации этого скрипта можно обобщить для большей полезности. Пример взят по следующей ссылке: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()