2010-09-03 18 views
14

Je suis relativement nouveau à Qt et je ne suis pas entièrement familier avec les widgets prêts à l'emploi. J'ai un widget un peu complexe (mais pas très complexe) à créer, et je ne veux pas réinventer les roues. Quel est le meilleur QWidget à utiliser comme point de départ pour la sous-classe et/ou QWidgets à utiliser pour composer mon widget. Voici le résultat final Je cherche (mes excuses pour le dessin brut):Quel (s) widget (s) Qt utiliser pour la liste d'icônes en lecture seule, défilement, repliable

Widget

Points clés:

  • Toutes les icônes prendront la même taille, disons 128 x 128. En ignorant les regroupements de catégories, ils devraient tous s'aligner dans une belle grille.
  • Le widget doit se développer pour remplir toutes les zones horizontales et verticales qu'il peut prendre. Expansion/rétrécissement horizontal peut augmenter/diminuer le nombre d'icônes affichées dans chaque ligne.
  • Les icônes sont regroupées et ces groupes doivent être repliables.
  • Si la hauteur du widget dépasse son espace, une barre de défilement verticale doit apparaître.
+10

+1 pour un plan. –

Répondre

7

Vous recherchez en fait certaines des options les plus ésotériques pour un QListView/QListWidget.

Au niveau supérieur, ajouter QTreeWidget ou QTreeView vous donnera la hiérarchie que vous recherchez, ainsi que la gestion de la zone de défilement.

Chaque élément listé du (étendu) QTreeXItem sera un QListView/QListWidget, en définissant setViewMode(QListView::IconMode) sur eux. Notez que pour obtenir l'aspect précis que vous souhaitiez voir ci-dessus, vous devrez probablement utiliser QListView et utiliser un délégué personnalisé, en manipulant le dessin vous-même (sauf si vous pouvez trouver un thème qui fera exactement ce que vous voulez)). Cependant, j'ai codé une courte solution PyQt ci-dessous en utilisant les classes Q * Widget car elles sont plus courtes, et montreront toujours comment obtenir la bonne mise en page. Si vous utilisez C++, les mêmes appels de fonction Qt s'appliquent, mais il est évident que vous pourriez avoir plus ou moins de comptabilité.

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

Comment faire de chaque élément de la liste un QListWidget? La seule chose que je vois que l'on peut utiliser est QTreeWidgetItem, qui semble ne prendre en charge qu'un nombre fixe de colonnes et de texte. Aurais-je besoin de reconstruire l'intégralité de l'arborescence lors d'un événement de redimensionnement de formulaire, en distribuant les éléments le long de la colonne manuellement? Sûrement il y a une meilleure manière .... –

+0

Il y a un appel de setItemWidget ... J'ai créé un petit exemple de PyQt dans l'édition. – jkerian

+0

Génial! Fonctionne très bien! Merci beaucoup pour l'aide! –