2017-09-25 1 views
0

나는 며칠 동안 아무런 도움없이이 작업을 해왔으므로 잘만 도와 줄 수 있습니다.클릭 행 색상 변경 클릭 PyQt

나는이 그것의 같은 데이터 기능이있는 사용자 정의 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 상황에 맞는 메뉴를 클릭하면 난 할 노력하고있어 것은이 나타납니다 :

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

간단한 해결책은 데이터베이스 테이블에 필드를 만들고 배경색을 변경하는 플래그로 사용하는 것이지만 데이터베이스에서 변경할 수없는 경우 새 역할을 만들어야합니다. 그런 다음 필요한 역할을 수행하기 위해 그 역할을 사용합니다. 플래그를 사전에 저장하기 때문에 사전의 키는 변경되지 않으므로 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) 
+0

감사합니다. 이것은 실제로 색상을 변경한다는 의미에서 작동하며, 색상을 되돌릴 수 있다는 것이 좋습니다. 그러나 전체 테이블을 빨간색으로 변경하는 것 같습니다. 선택한 행만이 아닙니다. 왜 그랬을까요? – aseylys

+0

정말입니까? 내 테스트에서 선택한 행을 변경하고 다음 예제를 실행하여 동일한 오류가 있으면 알려주십시오. https://gist.github.com/eyllanesc/150e981878122e171bd25dc470781a87 – eyllanesc

+0

프로젝트를 공유하여 내가 만든 위치를 확인하면 실수. 내 대답이 도움이된다면 올바른 것으로 표시하는 것을 잊지 마시기 바랍니다. – eyllanesc