单击PyQt更改行颜色

时间:2017-09-25 16:39:38

标签: python python-3.x pyqt pyqt5

我一直在努力工作这几天,但没有用,所以希望你们能帮助我。

我有一个自定义set /?,它有这个数据函数:

var oDataFilter = [
  new Filter({
    filters: [
      oPlantFilter,
      oMatTypeFilter,
      oMaterialNumberFilter
    ],
    and: true
  })
];

除了QSqlTableModel块之外,它与问题无关。我正在尝试做的是当我右键单击def data(self, index, role): #Formats Cells according to data in them if role == QtCore.Qt.TextAlignmentRole: if index.column() == 2: text = QtSql.QSqlTableModel.data(self, self.index(index.row(), 2), QtCore.Qt.DisplayRole) if text.split(): if not re.search(r'start|Z[NARXTFEISL]|gv', text.split()[0], re.I): return QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop else: return QtCore.Qt.AlignLeft else: pass else: return QtCore.Qt.AlignLeft if role == QtCore.Qt.BackgroundRole: if 'MILESTONE' in QtSql.QSqlTableModel.data(self, self.index(index.row(), 2), QtCore.Qt.DisplayRole): return QtGui.QBrush(QtCore.Qt.yellow) return QtSql.QSqlTableModel.data(self, index, role) 上下文菜单时出现:

BackgroundRole

我所要做的就是当我在上下文菜单上单击tableview时,我想要行(或者甚至是单元格,我将在此处采取任何操作)更改为红色。

我所做的一切都不起作用,我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是在数据库表中创建一个字段并用作标志来更改背景颜色,但如果您无法在数据库中进行更改,则必须创建一个新角色。然后我们将使用该角色进行必要的更改,为此我们将标志保存在字典中,字典的键将是id,因为这些不会更改。

class SqlTableModel(QtSql.QSqlTableModel):
    ExecuteRole = QtCore.Qt.UserRole + 1

    def __init__(self, parent=None, db = QtSql.QSqlDatabase()):
        QtSql.QSqlTableModel.__init__(self, parent, db)
        self.d = {}

    def data(self, index, role):
        if role == self.ExecuteRole:
            _id = self.getId(index)
            if _id in self.d.keys():
                return self.d[_id]
            return False

        if role == QtCore.Qt.BackgroundRole:
            if self.data(index, self.ExecuteRole):
                return QtGui.QBrush(QtCore.Qt.red)
            if 'MILESTONE' in QtSql.QSqlTableModel.data(self, self.index(index.row(), 2), QtCore.Qt.DisplayRole):
                return QtGui.QBrush(QtCore.Qt.yellow)

        return QtSql.QSqlTableModel.data(self, index, role)

    def getId(self, index):
        ix = self.fieldIndex("id")
        return self.data(self.index(index.row(), ix), QtCore.Qt.DisplayRole)

    def setData(self, index, value, role):
        if role == self.ExecuteRole:
            self.d[self.getId(index)] = value
            return True
        return QtSql.QSqlTableModel.setData(self, index, value, role)

    def roleNames(self):
        rn = QtSql.QSqlTableModel.roleNames(self)
        rn[self.SelectRole] = QtCore.QByteArray(b'execute')
        return rn

以上内容仅更改所选项目,直到手动刷新,但此行为不是想要这样做的,必须发出模型dataChanged()信号。

class TableView(QtWidgets.QTableView):
    def contextMenuEvent(self, event):
        pos = event.pos()
        menu = QtWidgets.QMenu()
        stepx = menu.addAction('Mark Step as Executed')
        stepdx = menu.addAction('Clear Step Execution')

        action = menu.exec_(self.mapToGlobal(pos))
        if action == stepx:
            if self.model():
                index = self.model().index(self.rowAt(pos.y()), 2)
                self.model().setData(index, True, SqlTableModel.ExecuteRole)
                self.model().dataChanged.emit(self.model().index(index.row(), 0),
                                              self.model().index(index.row(), self.model().columnCount()-1),
                                              [QtCore.Qt.BackgroundRole])

如果我们将状态从True更改为False,则当前实现具有取消选择的优势。

self.model().setData(index, False, SqlTableModel.ExecuteRole)