【问题标题】:Creating a custom item for QComboBox in Pyside在 Pyside 中为 QComboBox 创建自定义项
【发布时间】:2016-01-12 11:34:30
【问题描述】:

我想为我的QComboBox 创建一个项目,它连续显示一个字符串和 4 个像素图(最终用途是让用户可以从配色方案列表中进行选择)。

谁能帮我自定义QStandardItem 来获得这个效果?我以为我可以使用这些行来做到这一点,但我运气不佳。这是我迄今为止尝试过的......

myComboBox = QtGui.QComboBox()       

item = QtGui.QStandardItem()
item.setRowCount(4)

colour1 = QtGui.QPixmap(16, 16)
colour1 .fill(QtGui.QColor("red"))

colour2 = QtGui.QPixmap(16, 16)
colour2 .fill(QtGui.QColor("blue"))

colour3 = QtGui.QPixmap(16, 16)
colour3 .fill(QtGui.QColor("white"))

childitem1 = QtGui.QStandardItem(QtGui.QIcon(colour1), "1")
childitem2 = QtGui.QStandardItem(QtGui.QIcon(colour2), "2")
childitem3 = QtGui.QStandardItem(QtGui.QIcon(colour3), "3")

item.setChild(0, childitem1)
item.setChild(1, childitem2)
item.setChild(2, childitem3)

myComboBox.model().appendRow(item)

但我只是得到一个空的项目,没有一个孩子是可见的 - 很有可能我完全误解了它是如何工作的 :)

【问题讨论】:

    标签: python qt pyqt pyside qcombobox


    【解决方案1】:

    您必须创建一个QStandarItemModel,将您的项目附加到其中,最后您必须使用myComboBox.setModel()将此模型设置到您的组合框。

    类似的东西

    itemModel = QStandardItemModel()
    
    # create your items as you want
    itemModel.appendRow(your_items)
    
    myComboBox.setModel(itemModel)
    

    【讨论】:

    • 感谢您的回复,但很遗憾,我并没有完全得到预期的结果。我已经这样做了:itemModel = QtGui.QStandardItemModel() item1 = QtGui.QStandardItem("1") item2 = QtGui.QStandardItem("2") item3 = QtGui.QStandardItem("3") itemModel.appendRow([item1, item2, item3]) myComboBox.setModel(itemModel) 但结果是一个组合框条目,其中只有第一项,而不是预期的“2”和“3”
    • 我想我找到了问题所在,Combobox 似乎一次只显示一列,而不是全部 3 列!我会继续挖掘,看看有没有办法展示更多
    【解决方案2】:

    通过将表格视图放入组合框中,我设法获得了一种半解决方案,如下所示:

        itemModel = QtGui.QStandardItemModel()
    
        item1 = QtGui.QStandardItem("1")
        item2 = QtGui.QStandardItem("2")
        item3 = QtGui.QStandardItem("3")
    
        itemModel.appendRow([item1, item2, item3])
        myComboBox.setModel(itemModel)
    
        tv = QtGui.QTableView()
        tv.setModel(itemModel)
        tv.horizontalHeader().setVisible(False)
        tv.verticalHeader().setVisible(False)
        tv.resizeColumnsToContents()
        tv.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
    
        myComboBox.setView(tv)
    

    它不是 100% 漂亮,但它几乎可以胜任!感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2014-05-12
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多