Какие виджеты Qt использовать для чтения, прокрутки, разборки, списка значков

Я относительно новичок в Qt и не совсем знаком с готовыми виджетами. У меня есть несколько (но не очень) сложный виджет для создания и не хочу изобретать все колеса. Какой лучший QWidget используется в качестве отправной точки для подкласса и/или QWidgets для использования моего компоновщика. Вот конечный результат, который я ищу (извинения за грубый рисунок):

Widget

Ключевые моменты:

  • Все значки занимают одинаковый размер, скажем 128 x 128. Игнорируя группировки категорий, они должны выравниваться в хорошей сетке.
  • Виджет должен расширяться, чтобы заполнить всю горизонтальную и вертикальную области, которые он может принять. Расширение/сжатие по горизонтали может увеличить/уменьшить количество значков, отображаемых в каждой строке.
  • Иконки сгруппированы, и эти группы должны быть разборными.
  • Если высота виджета превышает его пространство, должна появиться вертикальная полоса прокрутки.

Ответы

Ответ 1

Вы действительно ищете некоторые из более эзотерических опций для QListView/QListWidget.

На верхнем уровне добавить QTreeWidget или QTreeView даст вам иерархию, которую вы ищете, а также управление областью прокрутки.

Каждый элемент списка (расширенный) QTreeXItem будет QListView/QListWidget, установив для него setViewMode(QListView::IconMode).

EDIT: Обратите внимание, что, чтобы получить точный вид, который вы хотели выше, вам, вероятно, придется использовать QListView и использовать пользовательский делегат, самостоятельно обрабатывая чертеж (если вы не найдете тему, которая будет делать именно то, что вы хотите). Тем не менее, я закодировал небольшое решение PyQt ниже, используя классы Q * Widget, потому что они короче и будут демонстрировать, как получить правильный макет. Если вы используете С++, применяются те же вызовы функций Qt, но, очевидно, вы можете иметь более или менее бухгалтерию.

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