首页 文章

单击PyQt更改行颜色

提问于
浏览
0

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

我有一个自定义 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 块之外,这些都与问题无关 . 我正在尝试做的是当我右键单击_615504时出现一个上下文菜单:

menu = QMenu()
stepx = menu.addAction('Mark Step as Executed')
stepdx = menu.addAction('Clear Step Execution')

action = menu.exec_(self.tableView.mapToGlobal(pos))
index = self.model.index(self.tableView.rowAt(pos.y()), 2)

if action == stepx:
    logging.info(' Executed Step: ' + str(self.tableView.rowAt(pos.y()) + 1))
    self.model.setData(index, QtCore.QVariant(QtGui.QBrush(QtCore.Qt.red)), QtCore.Qt.BackgroundRole)

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

我正在做的事情没有任何工作,我希望有人可以帮助我 .

1 回答

  • 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)
    

相关问题