Displaying Images in QListView with same thumbnail size keeping aspect ratio

2.7k views Asked by At

So I figured out how to display images in QListView: Here is how I did it

import sys
import os

from PyQt4 import QtGui, QtCore

class MyListModel(QtCore.QAbstractListModel): 
    def __init__(self, datain, parent=None, *args): 
        """ datain: a list where each item is a row
        """
        QtCore.QAbstractListModel.__init__(self, parent, *args) 
        self.listdata = datain

    def rowCount(self, parent=QtCore.QModelIndex()): 
        return len(self.listdata) 

    def data(self, index, role):
        if index.isValid() and role == QtCore.Qt.DecorationRole:
            return QtGui.QIcon(QtGui.QPixmap(self.listdata[index.row()]))
        if index.isValid() and role == QtCore.Qt.DisplayRole:
            return QtCore.QVariant(os.path.splitext(os.path.split(self.listdata[index.row()])[-1])[0])
        else: 
            return QtCore.QVariant()

class MyListView(QtGui.QListView):
    """docstring for MyListView"""
    def __init__(self):
        super(MyListView, self).__init__()
        # show in Icon Mode
        self.setViewMode(QtGui.QListView.IconMode)

        crntDir = "/usr/test1/Desktop"
        # create table
        list_data = []
        philes = os.listdir(crntDir)
        for phile in philes:
            if phile.endswith(".png"):
                list_data.append(os.path.join(crntDir, phile))
        lm = MyListModel(list_data, self)
        self.setModel(lm)
        self.show()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window =  MyListView()
    window.show()
    window.raise_()
    sys.exit(app.exec_())

but now I need how I can have all images displayed of same thumbnail size and the filename should not move them around instead file name should wrap to next line !!! how should I achieve that.

2

There are 2 answers

1
qurban On

Aspect ratio of a thumbnail in Qt is controlled by the scaled() method of QPixmap. This method also provides the option to control the size of thumbnail. Call this method on your original pixmap and it will return a new pixmap with the specified size and AspectRatioMode.

1
Wesley-Yu On
class MyListView(QtWidgets.QListView):
"""docstring for MyListView"""
def __init__(self):
    super(MyListView, self).__init__()
    # show in Icon Mode
    self.setViewMode(QtWidgets.QListView.IconMode)
    self.setIconSize(QtCore.QSize(80, 80))  #set icon size
    self.setGridSize(QtCore.QSize(100, 100)) #set icon grid display
    # self.selectionModel(self.selectedIndexes())
    crntDir = "D:/temp"
    # create table
    list_data = []
    philes = os.listdir(crntDir)
    for phile in philes:
        if phile.endswith(".png"):
            list_data.append(os.path.join(crntDir, phile))
    lm = MyListModel(list_data, self)
    self.setModel(lm)
    self.show()