5

カスタム モデルとデリゲートを使用してこの 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開発本の例から完全なコードを貼り付けます .

セルを編集した後にセルの背景色を変更するコードに変更するにはどうすればよいですか?

4

2 に答える 2

5

どういうわけか、モデル内の編集されたアイテムを追跡する必要があります。必要ありません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_())
于 2012-12-18T07:44:05.103 に答える
-2

QTableWidgetitemChangedに接続する必要がある信号があります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_()
于 2012-12-18T04:34:08.987 に答える