Я строю графический интерфейс для обработки изображений в PyQt. Одна из задач, которую мне нужно выполнить, - использовать полосу прокрутки для перемещения по каталогу файлов изображений. В частности, если есть 1000 изображений, скажем, в / my / dir, то я бы хотел, чтобы расстояние, прокручиваемое вдоль полосы прокрутки, соответствовало номеру изображения (от 1 до 1000). Таким образом, полоса прокрутки полностью слева будет image = 1, полоса прокрутки полностью справа будет image = 1000, и если полоса прокрутки составляет 33% пути слева направо, то отображаемое изображение имеет круглое числовое значение (0,33333 * 1000) = 333.
Прямо сейчас у меня есть рабочий набор виджетов, который будет рисовать изображение из каталога, а затем имеет кнопки «Далее» и «Предыдущий», которые можно использовать для навигации вперед и назад. Смысл этого программного обеспечения заключается в том, чтобы обеспечить контролируемое обучение с помощью глубоких человеческих аннотаций, поэтому существует необходимость быстрой прокрутки большого количества изображений, в которых не происходит значимых изменений. Вот почему мне нужна ползунок.
Если весь слот / сигнал работает для полос прокрутки так же, как и для кнопок, я уверен, что смогу прорваться через этот материал, чтобы он манипулировал именем растрового изображения и обновлял отображаемое изображение. Однако мне нужна некоторая базовая синтаксическая структура, объясняющая, как создать класс полосы прокрутки и поместить его под моим растровым изображением во фрейм QGridLayout.
Ответ, который я нашел через серфинг и мастеринг, приведен ниже.
Я нашел другое решение, которое хорошо взаимодействует, хотя мне нравится предложение @Stephen Terry фактически перебирать сами файлы. Мое решение основано на учебном коде, найденном здесь: http://zetcode.com/tutorials/pyqt4/widgets/
Я изменил это, сначала создав собственный небольшой класс:
class InterpolatingScrollBar(QtGui.QWidget):
def __init__(self,parent=None):
QtGui.QWidget.__init__(self, parent)
self.testbar = QtGui.QSlider(QtCore.Qt.Horizontal,self)
self.testbar.setGeometry(10,10,500,30)
self.testbar.setFocusPolicy(QtCore.Qt.NoFocus)
и затем создание экземпляра этого класса в классе основного контроллера,
self.scrollbar = buttonUtils.InterpolatingScrollBar()
self.scrollbar.testbar.setMinimum(self.overall_counter)
self.scrollbar.testbar.setMaximum(self.max_image_num)
где max_image_num вычисляется путем выполнения аналогичного вызова glob () и проверки наличия jpgs в каталоге. Затем я использую этот код для подключения к сигналу «значение изменено» полосы прокрутки:
self.connect(self.scrollbar.testbar,QtCore.SIGNAL('valueChanged(int)'),self.getScrollValue)
def getScrollValue(self,value):
self.overall_counter = value
self.pb1.previousSlot(self.overall_counter)
self.nb1.nextSlot(self.overall_counter)
self.pixmap = QtGui.QPixmap(self.directory_name + self.pb1.new_image_str)
self.label.setPixmap(self.pixmap)
, где pb1 и nb1 - «предыдущая кнопка» и «следующая кнопка», с соответствующими функциями, которые обновляют счетчики, отображаемые на этих кнопках, а также имя строки, ведущее к отображаемому новому изображению.