Настройка пользовательской полосы прокрутки в PyQt - PullRequest
0 голосов
/ 01 июня 2011

Я строю графический интерфейс для обработки изображений в 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 - «предыдущая кнопка» и «следующая кнопка», с соответствующими функциями, которые обновляют счетчики, отображаемые на этих кнопках, а также имя строки, ведущее к отображаемому новому изображению.

1 Ответ

1 голос
/ 01 июня 2011

Самый простой способ - использовать QListWidget и заполнить его изображениями в виде значков QListWidgetItem .Примером может быть что-то вроде этого

self.list_widget = QListWidget()
files = glob.glob('YourDirectory/*.jpg') #Get all jpegs in your directory
for i in files:
    self.list_widget.addItem(QListWidgetItem(QIcon(i),'your text here'))
self.list_widget.setIconSize(QSize(400,300)) #Set your image size

. Это позволит вам приблизиться к желаемому поведению полосы прокрутки;пользователь сможет видеть более одного изображения за раз, если вы не сделаете изображения достаточно большими, чтобы заполнить экран.Надеюсь, вы сможете настроить его под свои нужды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...