Che Qt widget di (s) da utilizzare per sola lettura, scorrevole, pieghevole, nell'elenco delle icone

StackOverflow https://stackoverflow.com/questions/3639468

Domanda

Sono relativamente nuovo per Qt, e non sono del tutto familiarità con i widget out-of-the-box. Ho un po '(ma non molto) widget di complessi per creare, e non voglio reinventare eventuali ruote. Qual è il miglior QWidget da utilizzare come punto di partenza per sottoclasse e / o QWidgets da usare per comporre il mio widget di. Ecco il risultato finale Cerco (scuse per il disegno grezzo):

Widget

Punti chiave:

  • Tutte le icone assumerà la stessa dimensione, diciamo 128 x 128. Ignorando i raggruppamenti di categoria, esse dovrebbero align in una bella griglia.
  • Il widget dovrebbe espandersi per riempire tutta l'area orizzontale e verticale si può prendere. Espansione / contrazione orizzontale può aumentare / diminuire il numero di icone visualizzate in ogni riga.
  • Le icone sono raggruppati, e questi gruppi dovrebbe essere pieghevole.
  • Se l'altezza del widget supera il suo spazio, dovrebbe comparire una barra di scorrimento verticale.
È stato utile?

Soluzione

Si sta effettivamente alla ricerca di alcune delle opzioni più esoterici per un QListView / QListWidget.

Al livello superiore, aggiungere o QTreeWidget QTreeView vi 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.

EDIT: Si noti che per ottenere l'aspetto preciso che volevi sopra, probabilmente dovrete utilizzare QListView e utilizzare un delegato personalizzato, la manipolazione del disegno te stesso (a meno che non si può trovare un tema che farà esattamente quello che vuoi). Tuttavia, ho codificato una breve soluzione PyQt di seguito utilizzando le classi Q * Widget perché sono più corti, e sarà ancora dare prova di come ottenere il layout di destra. Se stai usando C ++, applicare le stesse chiamate di funzione Qt, ma ovviamente si potrebbe avere più o meno la 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_())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top