1

チェックボックスの列を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 :(
  • コードが単純になるようにデリゲートを使用しないことは可能ですか?
  • レイアウトを使用し、モデルにチェックボックスを含めないようにする必要がありますか?
  • 簡単な解決策がありませんか?
4

1 に答える 1

1

Sibylle Koczianの作業に従って、QsqlQueryModel をサブクラス化することでマンガを作成しました。

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
于 2013-03-10T16:54:33.637 に答える