【问题标题】:How to change background color after editing QTableView cell?编辑 QTableView 单元格后如何更改背景颜色?
【发布时间】:2012-12-05 05:48:43
【问题描述】:

我有这个带有自定义模型和委托的 QTableView,我如何在编辑后更改单元格的背景颜色?

我应该在代表的setModelData() 中这样做吗?

index.model.setData(index, QVariant(True),Qt.UserRole) 

后来在模型的data() # 它在调用自己?

if role == Qt.BackgroundColorRole:
    if index.model().data(index,Qt.UserRole).toBool():
        return QVariant(QColor(Qt.darkBlue))

并且在模型的setData() 中我没有类似的代码:

if role==Qt.UserRole:
    ....

这样做的正确方法是什么?

编辑: 这是我在自定义模型中的整个 setData() 方法

def setData(self, index, value, role=Qt.EditRole):

if index.isValid() and 0 <= index.row() < len(self.particles):
    particle = self.particles[index.row()]
    column = index.column()
    if column == ID:
        value,ok= value.toInt()
        if ok:
            particle.id =value                 
    elif column == CYCLEIDANDNAME:
        cycleId,cycleName= value.toString().split(' ')
        particle.cycleId =cycleId
#                also need to set cycleName
        for name in self.cycleNames:
            if name.endsWith(cycleName):
                particle.cycleFrameNormalized=particle.cycleName = name
                break

    elif column == CYCLEFRAME:
        value,ok= value.toInt()
        if ok:
            print 'set new val to :',value
            particle.cycleFrame =value 
#                    self.setData(index,QVariant(QColor(Qt.red)),Qt.BackgroundRole)

    elif column == CLASSID:
        value,ok= value.toInt()
        if ok:
            particle.classId =value                 
    elif column == VARIATIONID:
        value,ok= value.toInt()
        if ok:
            particle.variationId =value                 

    self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),
              index, index)

    return True

return False

抱歉还是没有头绪,我将粘贴快速 gui 开发书示例中的完整代码: 我在这里发布了我的代码 http://pastebin.com/ShgRRMcY

编辑单元格后如何更改代码以使单元格背景颜色发生变化?

【问题讨论】:

  • 您使用的是哪种型号?
  • @X.Jacobs 我正在使用从QAbstractTableModel 继承的自定义模型,并且我已经实现了自己的setData(),但它只处理Qt.EditRole
  • 如何处理Qt.EditRole?请发布您的代码的可管理版本
  • @Shuman:在setData 中调用setData 有点毫无意义。它会调用自己。您需要将该颜色存储在数据中的某个位置(particle?),您可以在其中签入data 方法并返回BackgroundRole。顺便说一句,您在setData 中没有以任何方式使用role

标签: python pyqt qtableview


【解决方案1】:

您需要以某种方式跟踪模型中已编辑的项目。你不需要UserRole。您可以在内部保留此信息,但当然,如果您想将此信息公开给外部,UserRole 非常适合。

这是一个简单的例子。您可以将其调整为您的代码:

import sys
from PyQt4 import QtGui, QtCore

class Model(QtCore.QAbstractTableModel):
    def __init__(self, parent=None):
        super(Model, self).__init__(parent)

        # list of lists containing [data for cell, changed]
        self._data = [[['%d - %d' % (i, j), False] for j in range(10)] for i in range(10)]

    def rowCount(self, parent):
        return len(self._data)

    def columnCount(self, parent):
        return len(self._data[0])

    def flags(self, index):
        return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable

    def data(self, index, role):
        if index.isValid():
            data, changed = self._data[index.row()][index.column()]

            if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
                return data

            if role == QtCore.Qt.BackgroundRole and changed:
                return QtGui.QBrush(QtCore.Qt.darkBlue)

    def setData(self, index, value, role):
        if role == QtCore.Qt.EditRole:
            # set the new value with True `changed` status
            self._data[index.row()][index.column()] = [value.toString(), True]
            self.dataChanged.emit(index, index)
            return True
        return False

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    t = QtGui.QTableView()
    m = Model(t)
    t.setModel(m)
    t.show()

    sys.exit(app.exec_())

【讨论】:

  • 谢谢,虽然我使用的是 tableView,但我试过了。我在我的模型中的setData() 中使用了self.setData(index,QVariant(QColor(Qt.red)),Qt.BackgroundRole),但它不起作用。
  • @Shuman: setData 自己不会做任何事情。您应该存储传递给它的数据。如果你展示你的模型可能会更好。
  • @Shuman 再试一次,看看你self.setData(index,"foo-bar",Qt.EditRole)时会发生什么
  • @Avaris @X.Jacobs 我已经将我的模型粘贴到了 pastebin,我可以将 userRole 数据存储在单元格本身中吗?我的意思是,如果我使用默认表模型,它会存储它,但现在我使用的是自定义模型和自定义 setData() 我如何将值保存在单元格本身中? (或者实际上,即使默认模型也不会将值保存在单元格本身中,它会将值存储在模型上的某个实例变量中)。
【解决方案2】:

QTableWidget 有一个信号itemChanged 需要连接到slot。一旦连接到插槽,信号将通过已更改的QTableWidgetItem。从那里您可以使用QTableWidgetItem 的方法,例如setBackgroundColor 来更改背景。

这是一个例子

#! /usr/bin/env python2.7

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class Main(QTableWidget):

    def __init__(self):

        super(Main, self).__init__(2, 5)
        layout = QHBoxLayout(self)

        self.itemChanged.connect(self.changeBG)

    def changeBG(self, cell):

        cell.setBackgroundColor(QColor(225, 0, 225))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Main()
    main.show()
    app.exec_()

【讨论】:

  • 不幸的是,OP 使用的是 QTableView,而不是 QTableWidget。
猜你喜欢
  • 2013-12-16
  • 2015-08-30
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 2011-09-24
相关资源
最近更新 更多