2013-02-16 4 views
1

Я хочу добавить столбец флажков в Qsqlquerymodel. Флажки не привязаны к базе данных. Использование делегатов кажется слишком низким для того, что я пытаюсь сделать.Добавить виджет в Qsqlquerymodel

код Я хотел бы использовать будет основываться на (PyQt):

model = QtSql.QSqlQueryModel() 

model.insertColumn(2) #checkbox column 

checkboxes = list() #Used later to check checkboxe state 
for i in range(0, model.rowCount()): 
    checkboxes.append((i, QtGui.QCheckBox())) #store row and checkbox in list 
    model.addWidget(i, 2, checkboxes[-1][1]) #addWidget in row(i), col(2) does not exist :(
  • Можно не использовать делегатов, так что код проще?
  • Должен ли я использовать макеты и не включать флажки в модели?
  • Я пропустил простое решение?

ответ

1

Я mangaed путем подкласса QsqlQueryModel после Sibylle Koczian работы.

class CheckboxSqlModel(QtSql.QSqlQueryModel): 
    def __init__(self, column): 
     super(CheckboxSqlModel, self).__init__() 
     self.column = column 
     self.checkboxes = list() #List of checkbox states 
     self.first = list() #Used to initialize checkboxes 

    #Make column editable 
    def flags(self, index): 
     flags = QtSql.QSqlQueryModel.flags(self, index) 
     if index.column() == self.column: 
      flags |= QtCore.Qt.ItemIsUserCheckable 
     return flags 

    def data(self, index, role=QtCore.Qt.DisplayRole): 
     row = index.row() 
     if index.column() == self.column and role == QtCore.Qt.CheckStateRole: 
      #Used to initialize 
      if row not in self.first : 
       index = self.createIndex(row, self.column) 
       self.first.append(row) 
       self.checkboxes.append(False) 
       return QtCore.Qt.Unchecked 
      #if checked 
      elif self.checkboxes[row]: 
       return QtCore.Qt.Checked 
      else: 
       return QtCore.Qt.Unchecked 
     else: 
      return QtSql.QSqlQueryModel.data(self, index, role) 

    def setData(self, index, value, role=QtCore.Qt.DisplayRole): 
     row = index.row() 
     if index.column() == self.column and role == QtCore.Qt.CheckStateRole: 
      if value.toBool(): 
       self.checkboxes[row] = True 
      else: 
       self.checkboxes[row] = False 
      self.dataChanged.emit(index, index) 
      return True 
     else: 
      return False 
Смежные вопросы