In realtà stai cercando alcune delle opzioni più esoteriche per un QListView/QListWidget.
Al livello superiore, aggiungi QTreeWidget
o QTreeView
ti darà la gerarchia che stai cercando, oltre a gestire l'area di scorrimento.
ogni voce elencata del (espanso) QTreeXItem
sarà un QListView
/QListWidget
, impostando setViewMode(QListView::IconMode)
su di loro. MODIFICA: Nota che per ottenere l'aspetto preciso desiderato in precedenza, probabilmente dovrai utilizzare QListView e utilizzare un delegato personalizzato, gestendo il disegno da solo (a meno che non trovi un tema che faccia esattamente ciò che desideri). Tuttavia, di seguito ho codificato una breve soluzione PyQt utilizzando le classi Q * Widget perché sono più brevi e dimostreranno comunque come ottenere il layout corretto. Se stai usando C++, si applicano le stesse chiamate di funzione Qt, ma ovviamente potresti avere più o meno contabilità.
import sys
from PyQt4 import QtGui, QtCore
class displayItem(QtGui.QWidget): #A simple widget to display, just centers a digit in a 100x100 widget
def __init__(self,num):
QtGui.QWidget.__init__(self)
self.size=100
self.resize(self.size,self.size)
self.setMinimumSize(self.size,self.size)
self.text = num
def paintEvent(self,event):
p = QtGui.QPainter(self)
p.drawText(self.size//2,self.size//2,str(self.text))
app = QtGui.QApplication(sys.argv)
widget = QtGui.QTreeWidget()
widget.setWindowTitle('simple tree')
#Build the list widgets
treeItem1 = QtGui.QTreeWidgetItem(widget)
treeItem1.setText(0,"TreeWidget Parent") #Sets the "header" for your [+] box
list1 = QtGui.QListWidget() #This will contain your icon list
list1.setMovement(QtGui.QListView.Static) #otherwise the icons are draggable
list1.setResizeMode(QtGui.QListView.Adjust) #Redo layout every time we resize
list1.setViewMode(QtGui.QListView.IconMode) #Layout left-to-right, not top-to-bottom
listItem = QtGui.QListWidgetItem(list1)
listItem.setSizeHint(QtCore.QSize(100,100)) #Or else the widget items will overlap (irritating bug)
list1.setItemWidget(listItem,displayItem(1))
listItem = QtGui.QListWidgetItem(list1) #Add a few more items
listItem.setSizeHint(QtCore.QSize(100,100))
list1.setItemWidget(listItem,displayItem(2))
listItem = QtGui.QListWidgetItem(list1)
listItem.setSizeHint(QtCore.QSize(100,100))
list1.setItemWidget(listItem,displayItem(3))
list1.setAutoFillBackground(True) #Required for a widget that will be a QTreeWidgetItem widget
treeSubItem1 = QtGui.QTreeWidgetItem(treeItem1) #Make a subitem to hold our list
widget.setItemWidget(treeSubItem1,0,list1) #Assign this list as a tree item
treeItem2 = QtGui.QTreeWidgetItem(widget) #Make a fake second parent
treeItem2.setText(0,"TreeWidget Parent II")
widget.show() #kick off the app in standard PyQt4 fashion
sys.exit(app.exec_())
+1 per un progetto. –