PyQt4获取表格单元格颜色

时间:2016-02-16 21:37:30

标签: background pyqt4 python-3.4 qtablewidget

我有希望成为一个简单的问题。我想要一张桌子,在点击一个单元格后,它的背景变为彩色,然后再次点击 - 无色(返回白色)。这个想法与复选框相同,但我不希望我的单元格中有一个复选框(除非占用整个单元格的空间并自行调整颜色而不是检查)。我一直坚持如何检查细胞背景的颜色?如果我想让另一个单元格获得相同的颜色,我想从彩色单元格中获取背景颜色,然后将其用于另一个单元格。我被卡住了。 我尝试过color(),brushStyle()以及更多(可能不正确)。我相信对你们来说这很简单:)

EDIT 当然,抱歉。我的意思是QTableWidget,就像这样:

git mergetool

我想得到第一个细胞的颜色。我尝试使用:

table = QtGui.QTableWidget()
table.setRowCount(3)
table.setColumnCount(3)

我期望在所有RGB值上得到255,因为我认为默认背景为白色。默认颜色是白色还是默认没有颜色?我用这段代码得到全部零。我只想发表一个声明:

table.setItem(0, 0, QtGui.QTableWidgetItem())
bg = table.item(0, 0).background().color()

print ("R: " + str(bg.red()) + "; G: " + str(bg.green()) + " ; B: " + str(bg.blue()))

编辑2: 好的,我设法创建了自己的解决方案。在这里发布给任何有需要的人,虽然我认为解决方案不是很好,可能不适合其他用途而不是我的。

if (cell is colored)
    set cell background to white (default)
else
    set color to cell background

代码回应:

def clickTable(row, column):

        if table.item(row, column) == None:
            item1 = QtGui.QTableWidgetItem()
            item1.setBackground(QtGui.QColor(100,100,150))
            table.setItem(row, column ,item1)
        else:
            table.takeItem(row, column)

我知道 takeItem 可能会让这段代码对大多数人无用,但对我有用。

1 个答案:

答案 0 :(得分:1)

为了改变单个单元格中背景和文本的颜色,我总是不得不使用QItemDelegates,因为调色板和样式表的常规方法似乎没有提供单个单元格样式的方法。

基本上,您可以定义自定义数据角色(在本例中为ItemBackgroundColorRole),并为表格小部件中的项目设置这些自定义角色的数据。 QItemDelegate负责绘制表格小部件,我们可以覆盖paint方法来检查这些自定义数据角色并更改画家使用的颜色。

class MyDelegate(QItemDelegate):

    ItemBackgroundColorRole = Qt.UserRole + 1

    def __init__(self, parent, table):
        super(MyDelegate, self).__init__(parent)
        self.table = table

    def paint(self, painter, option, index):
        painter.save()
        item = self.table.itemFromIndex(index)
        if item:
            bg_color = item.data(MyDelegate.ItemBackgroundColorRole)
            if bg_color:
                # These two roles (Window, Base) both style different aspects of the "background"
                # Try with one or both to see which works for you
                option.palette.setColor(QPalette.Window, bg_color)
                option.palette.setColor(QPalette.Base, bg_color)
        super(MyDelegate, self).paint(painter, option, index)
        painter.restore()


table = QtGui.QTableWidget()
delegate = MyDelegate(None, table)
table.setItemDelegate(delegate)

item = QTableWidgetItem()
item.setData(MyDelegate.ItemBackgroundColorRole, QColor(Qt.red))

# To clear the color and go back to default
item.setData(MyDelegate.ItemBackgroundColorRole, None)

要在单击单击时触发此操作,请连接到QTableWidget cellClicked信号。

table.cellClicked.connect(handle_click)

def handle_click(row, column):
    item = table.item(row, column)
    bg_color = item.data(MyDelegate.ItemBackgroundColorRole)
    color = None if bg_color else QColor(Qt.red)
    item.setData(MyDelegate.ItemBackgroundColorRole, color)