更改QTableWidgetItem的背景颜色

5

我想改变QTableWidgetItem的背景颜色,但是已有一些帖子讨论了这个问题,但是给出的解决方案都不能满足我的需求。

对于每一行,我逐个创建QTableWidgetItems,然后使用setItem将其分配到当前行的单元格中。

我尝试在它们被创建后立即更改颜色:

  1. self.myTable.myItem1.setBackgroundColor(QtGui.QColor(255,100,0,255))
  2. self.myTable.myItem1.setBackground(QtGui.QColor(255,100,0,255))
  3. self.myTable.myItem1.setData(Qt.BackgroundRole,QtGui.QColor(255,100,0,255))

但是这些解决方案在我的情况下都无法实现效果。 我是否遗漏了什么?

欢迎任何帮助。


self.myTable.myItem1.background().setColor(QtGui.QColor(255,100,0,255)) 的效果如何? - mdurant
它还是不起作用。。:( 我尝试了: font=QtGui.QFont(self) font.setBold(True) self.myTable.myItem1.setFont(font)它可以工作。(但这不是我想要的) - Olivier Giniaux
这正是我一开始寻找的东西。 我目前有一个通用样式表,但由于我只想为一个 QTableWidgetItem 上色,所以我想在我的项上使用类似 setObjectName 的东西,并在我的样式表中为此名称分配特殊样式,但是 QTableWidgetItem 没有 setObjectName。对于 setStyleSheet 也是同样的情况。 - Olivier Giniaux
2
@OdgyGsf。对我来说,这三种方法都能正常工作(即它们将背景颜色更改为红色)。请发布一些简单的示例代码以演示问题,以便其他人可以尝试重现它。 - ekhumoro
@mdurant,你的代码有误。background()返回值为QBrush,因此修改它没有任何效果。 - Pavel Strakhov
2个回答

6
你需要设置item的背景颜色。有几种方法可以做到这一点(完整脚本在下面):
  • 选项1:在项目上设置背景,然后将项目添加到表中。

在此示例中,我们将item1设置为内容为“row1”。如果这是偶数行,则将背景设置为浅红/粉色。

item1 = QtGui.QTableWidgetItem('row1')
if row % 2 == 0:
    item1.setBackground(QtGui.QColor(255, 128, 128))
self.table.setItem(row,0,item1)
  • 选项2:在表格中已有的项目上设置背景。这要求你直接对该项目进行操作。

在这个例子中,我们将背景设置为浅灰色,应用于第1行第0列的项目:

self.table.item(1,0).setBackground(QtGui.QColor(125,125,125))

这里有一份完整的脚本,展示了红色和灰色高亮:

from PyQt4 import QtCore
from PyQt4 import QtGui 
import sys

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.table = QtGui.QTableWidget()
        self.table.setColumnCount(2)
        self.setCentralWidget(self.table)
        data1 = ['row1','row2','row3','row4']
        data2 = ['1','2.0','3.00000001','3.9999999']

        self.table.setRowCount(4)

        for row in range(4):
            item1 = QtGui.QTableWidgetItem(data1[row])
            if row % 2 == 0:
                item1.setBackground(QtGui.QColor(255, 128, 128))
            self.table.setItem(row,0,item1)

        self.table.item(1,0).setBackground(QtGui.QColor(125,125,125))


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

输出:

示例输出展示了两种突出背景的方法


感谢您的精彩帖子。然而,我仍然无法使它在我的示例中起作用。我认为问题来自于我的样式表。可能有一种不能被覆盖的设置颜色或类似的东西。很奇怪。 - Olivier Giniaux

0
对于任何正在搜索此问题的人: QTableWidgetItem.setBackground 对我不起作用,因为我将此样式表用作表格的样式:
QTableWidget::item{border: 0px; padding-left: 2px;}

我只想要 padding-left: 2px 这一部分,但是没有 border: 0px 它就不起作用,所以我加上它了,结果 QTableWidgetItem.setBackground 就出问题了。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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