PyQt:如何自定义QComboBox项目外观

6

是否可以先创建组合框的项目,然后设置其显示属性(例如背景颜色、图标、字体颜色、字体大小等),最后使用QComboBox.addItem()方法将其添加到组合框中?目前我只能使用以下方法:

myCombobox = QtGui.QComboBox
for i in range(10):
    myCombobox.addItem(str(i))

毋庸置疑,这种方法留下了很少的空间来定制每个组合框项目的显示属性。我想要的是像这样的东西:
myCombobox = QtGui.QComboBox
for i in range(10):
    item = comboboxItem()
    item.setColor(allBlueAndShiny)
    font = QtGui.QFont()
    font.setPointSize(10)
    item.setFont(font)

    # Only after item was set with all display properties it is added:        
    myCombobox.addItem(str(i))

这里有一个QCombobox自定义项目的可工作示例。感谢ekhumoro!


from PyQt4 import QtGui, QtCore

def main():
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QWidget()
    main_layout = QtGui.QVBoxLayout()
    # QComboBox
    combo = QtGui.QComboBox()
    model = combo.model()
    for row in range(10):
        item = QtGui.QStandardItem(str(row))
        item.setForeground(QtGui.QColor('red'))
        font = item.font()
        font.setPointSize(10)
        item.setFont(font)
        model.appendRow(item)
    main_layout.addWidget(combo) 

    ok_button = QtGui.QPushButton("OK")
    ok_button.clicked.connect(OK)      
    main_layout.addWidget(ok_button) 

    main_layout.addStretch(1)
    window.setLayout(main_layout)
    window.show()
    sys.exit(app.exec_())

def OK(self):
    print 'OK'

if __name__ == '__main__':
    main()
1个回答

9

默认情况下,QComboBox使用QStandardItemModel,因此可以使用QStandardItem方法来更改各种显示属性:

combo = QComboBox()
model = combo.model()
for row in range(10):
    item = QStandardItem(str(row))
    item.setForeground(QColor('red'))
    font = item.font()
    font.setPointSize(10)
    item.setFont(font)
    model.appendRow(item)

提示:

如果您想重置其中一个项属性,请将其设置为 None,如下所示:

    item = self.combo.model().item(row)
    item.setData(None, Qt.ForegroundRole)

我们如何将一个项目的前景色重置为默认的“无颜色”?...在项目已经设置item.setForeground(QtGui.QColor('red'))之后,有必要将其显示从彩色切换到默认值,反之亦然... - alphanumeric
@Sputnix。请看我的更新答案。另外:我刚意识到QComboBox已经使用了QStandardItemModel,所以我相应地简化了我的示例。 - ekhumoro
谢谢!我发现要重置项目的颜色,只需将其设置为(QtGui.QColor('black'))。仅当单击Combobox以显示所有项目列表时,项目才会显示其颜色。但是,当Combobox关闭时,该项目不显示颜色(仅显示常规颜色)。是否有办法“强制”项目在ComoboBox“折叠”时显示其颜色? - alphanumeric
@Sputnix。将前景重置为“黑色”是一个错误,因为并非所有的配色方案都将该颜色作为默认颜色(深色配色方案会有对比明亮的默认颜色)。至于另一个问题:我认为这超出了当前问题的范围,请开启一个新的问题。 - ekhumoro
@TodStoychev。谢谢-这只是一个从OP原始代码示例中复制的小错误(现已更正)。请为此类问题建议编辑,因为并非每个人都阅读所有评论。 - ekhumoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接