【问题标题】:PyQt: How to customize QComboBox item appearancePyQt:如何自定义 QComboBox 项目外观
【发布时间】:2014-05-18 05:23:57
【问题描述】:

是否可以先创建一个组合框项,然后设置其显示属性(例如背景颜色、图标、字体颜色、字体大小等),然后才使用QComoboBox.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()

【问题讨论】:

    标签: python qt pyqt qcombobox


    【解决方案1】:

    默认情况下,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)
    

    PS:

    如果要重置item properties 之一,请将其设置为None,如下所示:

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

    【讨论】:

    • 我们如何将项目的前景色重置为默认的“无颜色”? ...在已设置项目后 item.setForeground(QtGui.QColor('red')) 需要将其显示从颜色切换为默认值,反之亦然...
    • @Sputnix。请参阅我的更新答案。另外:我刚刚意识到QComboBox 已经使用了QStandardItemModel,所以我相应地简化了我的示例。
    • 谢谢!我发现要重置项目的颜色,我可以将其设置为 (QtGui.QColor('black'))。当您单击组合框以显示所有项目列表时,项目仅显示其颜色。但是当组合框关闭时,该项目不显示颜色(只是常规颜色)。即使ComoboBox“折叠”,有没有办法“强制”项目显示其颜色?
    • @Sputnix。将前景重置为“黑色”是一个错误,因为并非所有配色方案都会将该颜色作为默认颜色(深色配色方案默认具有对比鲜明的浅色)。至于另一个问题:我认为这超出了当前问题的范围,所以请重新开始。
    • @TodStoychev。谢谢 - 这只是从 OPs 原始代码示例中复制的一个小错字(现已更正)。请建议对此类问题进行编辑,因为不是每个人都阅读所有 cmets。
    猜你喜欢
    • 2021-09-04
    • 2014-11-02
    • 2012-01-15
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多