I have made a QTableView that displays images from disk, there are two seriously agonizing problem I am facing.
First of after the windows shows up making it maximize or changing size of window is very slow,
and secondly I want to display images height width dependong on what can fit in the full window size of the maximized window keeping the aspect size of the thumbnails. Right now Images dont fit properly and text is getting displayed on left while i want it to display at bottom of the image.
import sys
import os
from PyQt4 import QtGui, QtCore
class MyListModel(QtCore.QAbstractTableModel):
def __init__(self, datain, col ,parent=None, *args):
""" datain: a list where each item is a row
"""
QtCore.QAbstractListModel.__init__(self, parent, *args)
self._listdata = datain
self._col = col
def colData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
return QtCore.QString("Images")
else:
return QtCore.QString(os.path.splitext(self._listdata[section])[-1][1:].upper())
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self._listdata)
def columnCount(self, parent):
return self._col
def data(self, index, role):
if role == QtCore.Qt.EditRole:
row = index.row()
column = index.column()
fileName = os.path.split(self._listdata[row][column])[-1]
return fileName
if role == QtCore.Qt.ToolTipRole:
row = index.row()
column = index.column()
fileName = os.path.split(self._listdata[row][column])[-1]
return QtCore.QString(fileName)
if index.isValid() and role == QtCore.Qt.DecorationRole:
row = index.row()
column = index.column()
value = self._listdata[row][column]
pixmap = QtGui.QPixmap()
# pixmap.scaled(400,300, QtCore.Qt.KeepAspectRatio)
pixmap.load(value)
return QtGui.QImage(pixmap).scaled(120,100)
if index.isValid() and role == QtCore.Qt.DisplayRole:
row = index.row()
column = index.column()
value = self._listdata[row][column]
fileName = os.path.split(value)[-1]
return os.path.splitext(fileName)[0]
def flags(self, index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
def setData(self, index, value, role=QtCore.Qt.EditRole):
if role == QtCore.Qt.EditRole:
row = index.row()
column = index.column()
newName = os.path.join(str(os.path.split(self._listdata[row][column])[0]), str(value.toString()))
self.__renameFile(self._listdata[row][column], newName)
self._listdata[row][column] = newName
self.dataChanged.emit(index, index)
return True
return False
def __renameFile(self, fileToRename, newName):
try:
os.rename(str(fileToRename), newName)
except Exception, err:
print err
class MyTableView(QtGui.QTableView):
"""docstring for MyTableView"""
def __init__(self):
super(MyTableView, self).__init__()
sw = QtGui.QDesktopWidget().screenGeometry(self).width()
sh = QtGui.QDesktopWidget().screenGeometry(self).height()
self.resize(sw, sh)
thumbWidth = 100
thumbheight = 120
col = sw/thumbWidth
self.setColumnWidth(thumbWidth, thumbheight)
crntDir = "/Users/krystoSan/Pictures"
# create table
list_data = []
philes = os.listdir(crntDir)
for phile in philes:
if phile.endswith(".png") or phile.endswith("jpg"):
list_data.append(os.path.join(crntDir, phile))
_twoDLst = convertToTwoDList(list_data, col)
lm = MyListModel(_twoDLst, col, self)
self.setModel(lm)
self.show()
def convertToTwoDList(l, n):
return [l[i:i+n] for i in range(0, len(l), n)]
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = MyTableView()
window.show()
window.raise_()
sys.exit(app.exec_())
resizing the window or changing column width or height slow and sluggish...