什么Qt小部件用于只读,可滚动,可折叠,图标列表

Dav*_*eer 14 user-interface qt widget qwidget

我对Qt比较陌生,并不完全熟悉开箱即用的小部件.我有一个(但不是很)非常复杂的小部件来创建,并且不想重新发明任何轮子.什么是最好的QWidget用作子类和/或QWidgets用于组成我的小部件的起点.这是我正在寻找的最终结果(粗略绘图道歉):

窗口小部件

关键点:

  • 所有图标将占用相同的大小,例如128 x 128.忽略类别分组,它们都应该在一个漂亮的网格中对齐.
  • 小部件应该展开以填充它可以采用的所有水平和垂直区域.水平扩展/收缩可以增加/减少每行中显示的图标数量.
  • 图标被分组,这些组应该是可折叠的.
  • 如果窗口小部件的高度超出其空间,则应显示垂直滚动条.

jke*_*ian 7

您实际上正在为QListView/QListWidget寻找一些更深奥的选项.

在顶层,添加QTreeWidgetQTreeView将为您提供您正在寻找的层次结构,以及管理滚动区域.

(扩展的)每个列出的项目QTreeXItem将是QListView/ QListWidget,设置setViewMode(QListView::IconMode)它们.

编辑:请注意,为了获得您想要的精确外观,您可能必须使用QListView并使用自定义委托,自己处理绘图(除非您可以找到一个完全符合您需要的主题).但是,我使用Q*Widget类编写了一个简短的PyQt解决方案,因为它们更短,并且仍将演示如何获得正确的布局.如果您正在使用C++,则应用相同的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_())
Run Code Online (Sandbox Code Playgroud)