Thumbnails
Verfasst: Montag 7. September 2015, 21:02
Hallo Leute,
ich versuche mich gerade daran zu machen, mir eine Art "Thumbnails" zu basteln. Dazu habe ich ein lauffähiges Programm. Wie ihr gleich im Quelltext feststellen werdet, versuche ich das einmal mit QTreeView und einmal mit QListView. Je nach dem, von welcher Qt-Klasse ihr ableitet, müsst ihr im Quelltext das entsprechende auskommentieren. Ich habe selbst für mich die Stellen markiert, welche für QListView und welche für QTreeView sind. Weiterhin werdet ihr mit einem Blick in die MyListModel()-Klasse, welche von der QAbstractListModel()-Klasse abgeleitet wird, sehen, dass ich in der data()-Funktion versuche, die Größe des Bildes festzulegen. Übertriebener weise habe ich hier mal 2500x2000 genommen. Aber die Bilder in diesem Programm bleiben immer gleich groß - es ändert sich nichts.
Was möchte ich? Ich möchte in der Lage sein, die Bilder entsprechend nach meiner Vorstellung anzupassen. Zum Beispiel in Thumbnail-Größe. Von mir aus 128x128 oder 250x250. Aber die Bilder werden hier viel zu klein dargestellt. Ein weiteres Problem habe ich, dass die Anordnung der Bilder irgendwie nicht richtig positioniert sind. Ich möchte, dass alle Bilder gleichmäßig angeordnet sind, und nicht irgendwie verschoben aussehen. Und ich möchte, dass die Bilder auch nebeneinander, soweit es möglich ist, angeordnet sind, und nicht nur untereinander. Das ist auch der Grund, weshalb ich mich auch an QTreeView probiere, da ich vermute, dass QListView hier nicht ausreichend ist.
Um mein Programm nutzen zu können, solltet ihr einen Ordner anlegen, und Bilder mit .*jpg- und/oder *.png-Endungen füllen. Und in Zeile 33 müsst ihr euren Pfad zu dem Ordner anpassen.
So sieht das Programm bei mir aus:

Und so hätte ich es gerne - sozusagen meine Wunschvorstellung:

ich versuche mich gerade daran zu machen, mir eine Art "Thumbnails" zu basteln. Dazu habe ich ein lauffähiges Programm. Wie ihr gleich im Quelltext feststellen werdet, versuche ich das einmal mit QTreeView und einmal mit QListView. Je nach dem, von welcher Qt-Klasse ihr ableitet, müsst ihr im Quelltext das entsprechende auskommentieren. Ich habe selbst für mich die Stellen markiert, welche für QListView und welche für QTreeView sind. Weiterhin werdet ihr mit einem Blick in die MyListModel()-Klasse, welche von der QAbstractListModel()-Klasse abgeleitet wird, sehen, dass ich in der data()-Funktion versuche, die Größe des Bildes festzulegen. Übertriebener weise habe ich hier mal 2500x2000 genommen. Aber die Bilder in diesem Programm bleiben immer gleich groß - es ändert sich nichts.
Was möchte ich? Ich möchte in der Lage sein, die Bilder entsprechend nach meiner Vorstellung anzupassen. Zum Beispiel in Thumbnail-Größe. Von mir aus 128x128 oder 250x250. Aber die Bilder werden hier viel zu klein dargestellt. Ein weiteres Problem habe ich, dass die Anordnung der Bilder irgendwie nicht richtig positioniert sind. Ich möchte, dass alle Bilder gleichmäßig angeordnet sind, und nicht irgendwie verschoben aussehen. Und ich möchte, dass die Bilder auch nebeneinander, soweit es möglich ist, angeordnet sind, und nicht nur untereinander. Das ist auch der Grund, weshalb ich mich auch an QTreeView probiere, da ich vermute, dass QListView hier nicht ausreichend ist.
Um mein Programm nutzen zu können, solltet ihr einen Ordner anlegen, und Bilder mit .*jpg- und/oder *.png-Endungen füllen. Und in Zeile 33 müsst ihr euren Pfad zu dem Ordner anpassen.
Code: Alles auswählen
import sys
import os
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QLabel
from PyQt4.QtCore import Qt
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:
img_size = QtCore.QSize(2500, 2000)
return QtGui.QIcon(QtGui.QPixmap(self.listdata[index.row()]).scaled(img_size, Qt.KeepAspectRatio))
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.QTreeView):
class MyListView(QtGui.QListView):
def __init__(self):
super(MyListView, self).__init__()
# show in Icon Mode - only for QListView
self.setViewMode(QtGui.QListView.IconMode)
# path to the folder that contains image-files
crntDir = os.path.abspath(os.path.join('test_pic_nails'))
# create empty list
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))
lm = MyListModel(list_data, self)
self.setModel(lm)
# All settings of QTreeView-class
## self.setHeaderHidden(True)
## self.setSelectionMode(QtGui.QTreeView.SingleSelection)
## self.setFocusPolicy(QtCore.Qt.NoFocus)
## self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
## self.setFrameShape(QtGui.QFrame.StyledPanel)
## self.setFrameShadow(QtGui.QFrame.Plain)
## self.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
## self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
## self.setAlternatingRowColors(True)
## self.setRootIsDecorated(False)
## self.setUniformRowHeights(False)
## self.setItemsExpandable(False)
## self.setSortingEnabled(True)
## self.setAnimated(True)
## self.setAllColumnsShowFocus(True)
## self.setExpandsOnDoubleClick(False)
## self.setObjectName("tree_view")
self.show()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = MyListView()
#window.show()
window.raise_()
sys.exit(app.exec_())

Und so hätte ich es gerne - sozusagen meine Wunschvorstellung:
