在PyQt中配置自定义滚动条

时间:2011-05-31 23:21:50

标签: python image-processing pyqt scrollbar

我正在为PyQt中的图像处理构建GUI。我需要做的一项任务是使用滚动条在图像文件目录中移动。具体来说,如果在/ my / dir中有1000个图像,那么我希望沿滚动条滚动的距离对应于图像编号(1到1000之间)。所以左边的滚动条将是image = 1,右边的滚动条将是image = 1000,如果滚动条是从左到右的33%,那么显示的图像有数值圆(0.33333 * 1000)= 333。

现在我有一组工作小部件可以从目录中绘制图像,然后有“下一步”和“上一页”按钮,您可以使用这些按钮向前和向后导航。该软件的目的是允许通过深度人类注释进行监督学习,因此需要快速滚动大量图像,其中没有发生有意义的变化。这就是我需要滑杆的原因。

如果滚动条的整个插槽/信号内容对按钮的作用相同,我相信我可以通过这些东西破解我的方式来操作pixmap图像名称并更新显示的图像。我需要的帮助是一些基本语法,解释如何创建一个滚动条类,并将它放在我的pixmap下面的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来计算的。然后我使用此代码连接到滚动条的'value changed'信号:

    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 个答案:

答案 0 :(得分:1)

最简单的方法是使用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

这将使您接近所需的滚动条行为;除非您使图像足够大以填满屏幕,否则用户将能够一次看到多个图像。希望你能调整它以满足你的需求。