在PyQt中配置自定义滚动条

问题描述

| 我正在构建用于PyQt中图像处理的GUI。我需要做的一项任务是使用滚动条在图像文件目录中移动。具体来说,如果在/ my / dir中有1000张图像,那么我希望沿着滚动条滚动的距离对应于图像编号(在1到1000之间)。因此,最左侧的滚动条将是image = 1,最右侧的滚动条将是image = 1000,如果滚动条是从左到右的33%,则显示的图像将具有数值取整(0.33333 * 1000)= 333。 现在,我有一组工作部件,这些工作部件将从目录中绘制图像,然后具有\'Next \'和\'PrevIoUs \'按钮,可用于向前和向后导航。该软件的重点是允许通过深层的人类注释进行有监督的学习,因此需要快速滚动浏览没有有意义变化的大量图像。这就是为什么我需要滑动条。 如果整个插槽/信号素材在滚动条上的工作原理与按钮上的效果相同,那么我相信我可以破解这些东西以操纵像素图图像名称并更新显示的图像。不过,我需要的是一些基本语法来解释如何创建滚动条类,并将其放置在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()进行类似调用并检查目录中的jpg来计算的。然后,我使用以下代码连接到滚动条的“值已更改”信号:
    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是\'prevIoUs button \'和\'next button \',具有更新这些按钮上显示的计数器的相应功能,以及导致显示新图像的字符串名称。     

解决方法

        最简单的方法是使用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
这将使您接近所需的滚动条行为;除非您将图像放大到足以填满整个屏幕,否则用户一次只能看到一幅以上的图像。希望您可以对其进行调整以满足您的需求。