【问题标题】:What Qt widget(s) to use for read-only, scrollable, collapsible, icon list用于只读、可滚动、可折叠、图标列表的 Qt 小部件
【发布时间】:2011-04-08 01:21:35
【问题描述】:

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

关键点:

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

【问题讨论】:

    标签: user-interface qt widget qwidget


    【解决方案1】:

    您实际上是在为 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_())
    

    【讨论】:

    • 如何使每个列出的项目成为 QListWidget?我看到的唯一可以使用的是 QTreeWidgetItem,它似乎只支持固定列数的文本和图标。我是否需要在表单调整大小事件上重建整个树,手动沿列分布项目?当然有更好的方法....
    • 有一个 setItemWidget 调用...我在编辑中创建了一个小的 PyQt 示例。
    • 太棒了!效果很好!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多