什么QT小部件用于仅阅读,可滚动,可折叠,图标列表
-
30-09-2019 - |
题
我对QT的新手相对较新,并且对开箱即用的小部件并不完全熟悉。我有一个(但不是很复杂的小部件)可以创建,并且不想重新发明任何车轮。什么是最佳的Qwidget作为子类和/或Qwidgets来构成我的小部件的起点。这是我正在寻找的最终结果(对原油绘画表示歉意):
关键点:
- 所有图标都将占相同的大小,例如128 x128。忽略类别分组,它们都应该在一个不错的网格中对齐。
- 小部件应扩展,以填充它可以采取的所有水平和垂直区域。水平扩展 /收缩可能会增加 /减少每行中显示的图标数量。
- 图标分组,这些组应折叠。
- 如果小部件的高度超过其空间,则应出现垂直滚动条。
解决方案
实际上,您正在寻找QListView/QlistWidget的一些更深奥的选项。
在最高级别,添加 QTreeWidget
或者 QTreeView
将为您提供所需的层次结构以及管理滚动区域。
(扩展)的每个列出的项目 QTreeXItem
将是一个 QListView
/QListWidget
, , 环境 setViewMode(QListView::IconMode)
在他们。
编辑:请注意,要获得上面想要的精确外观,您可能必须使用QListView并使用自定义代表,并自己处理图纸(除非您可以找到一个可以完全做您想要的主题)。但是,我使用Q*小部件类对下面的简短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_())
不隶属于 StackOverflow