2010-09-03 7 views
14

Sono relativamente nuovo a Qt e non mi è del tutto familiare con i widget pronti all'uso. Ho un widget un po '(ma non molto) complesso da creare e non voglio reinventare nessuna ruota. Qual è il miglior QWidget da utilizzare come punto di partenza per sottoclasse e/o QWidgets da utilizzare per comporre il mio widget. Ecco il risultato finale Cerco (scuse per il disegno greggio):Quali widget Qt utilizzare per elenco di sola lettura, scorrevole, pieghevole, icona

Widget

Punti chiave:

  • Tutte le icone avranno la stessa dimensione, diciamo 128 x 128. Ignorando i raggruppamenti di categorie, dovrebbero allinearsi in una bella griglia.
  • Il widget deve espandersi per riempire tutta l'area orizzontale e verticale che può assumere. Espandere/restringere orizzontalmente può aumentare/diminuire il numero di icone mostrate in ogni riga.
  • Le icone sono raggruppate e tali gruppi dovrebbero essere pieghevoli.
  • Se l'altezza del widget supera il suo spazio, dovrebbe apparire una barra di scorrimento verticale.
+10

+1 per un progetto. –

risposta

7

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_()) 
+0

Come si fa a QListWidget ciascun elemento elencato? L'unica cosa che vedo che si può usare è QTreeWidgetItem, che sembra supportare solo un numero fisso di colonne di testo e icone. Dovrei ricostruire l'intero albero in un evento di ridimensionamento del modulo, distribuendo manualmente gli articoli lungo la colonna? Sicuramente c'è un modo migliore .... –

+0

C'è una chiamata setItemWidget ... Ho creato un piccolo esempio PyQt nella modifica. – jkerian

+0

Fantastico! Funziona alla grande! Grazie mille per l'aiuto! –