1

テーブルビューでチェックボックスを編集可能にすることができました。テーブルビューに表示されますが、何もできません。フラグが正しく設定されていないようです。

class CheckBox(QtGui.QStyledItemDelegate):

    def __init__(self, parent = None):
        QtGui.QGraphicsWidget.__init__(self)

    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsUserCheckable | Qt.ItemIsEnabled

    def paint (self, painter, option, index):

        item = QtGui.QTableWidgetItem()
        item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)

        # picks up data from database
        checked = index.model().data(index, Qt.EditRole).toBool()

        # Then draw the checkbox
        box = QtGui.QStyleOptionButton()

        box.palette = option.palette
        box.rect = option.rect
        box.state = QtGui.QStyle.State_Enabled

        if checked:
            box.state |= QtGui.QStyle.State_On
        else:
            box.state |= QtGui.QStyle.State_Off

        style = QtGui.QApplication.instance().style()
        style.drawControl(QtGui.QStyle.CE_CheckBox, box, painter)
        painter.restore()

こんにちは、これはデリゲートの代わりに checkrole を使用するための Avaris コメントに基づくレビュー済みコードです。しかし、私はまだ問題を解決することができます。チェックボックスにチェックを入れることができず、代わりにスピンボックスが表示されます。データベースから値 (0 または 1) を正しく読み取っていますが、この値を非表示にしたいと考えています。どんな助けでも大歓迎です!

ここに画像の説明を入力

class EditableShoSqlModel(QtSql.QSqlQueryModel):
    def __init__(self, parent=None):
        super(EditableShoSqlModel, self).__init__(parent)

    def flags(self, index):
        flags = super(EditableShoSqlModel, self).flags(index)
        if index.column() in (12):
            flags |= QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsUserCheckable | Qt.ItemIsEnabled
        return flags

    def data(self, index, role=QtCore.Qt.DisplayRole):
        value2 = super(EditableShoSqlModel, self).data(index)
        if index.column() == 12 and role == QtCore.Qt.CheckStateRole:
            if value2 != 0:
                return QtCore.Qt.Checked
            else:
                return QtCore.Qt.Unchecked
        return QtSql.QSqlQueryModel.data(self, index, role)


    def setData(self, index, value, role):
        if index.column() not in (12):
            return False

        primaryKeyIndex = self.index(index.row(), 0)
        id = self.data(primaryKeyIndex)
        #self.clear()

        if index.column() == 12 and role == QtCore.Qt.CheckStateRole:
            value2 = super(EditableShoSqlModel, self).data(index)
            if value2 != 0:
                ok = self.setAniStatus(id, value)
                return QtCore.Qt.Unchecked
            else:
                ok = self.setAniStatus(id, value)
                return QtCore.Qt.Checked
            return True
        self.refresh()
        return ok

    def refresh(self):
        MainWindow.AllShotsFromProject ()

    def setAniStatus(self, id, Number):
        mon = Number
        if mon != False:
           mon = 1
        else:
           mon = 0
        print "ANIS"            
        query = QtSql.QSqlQuery()
        sql = "UPDATE Shot SET Ani= '{0}' WHERE idShot = {1}".format(int(mon), id.toString())
        query.prepare(sql)
        print 'lastQuery:', query.lastQuery()
        return query.exec_()
4

1 に答える 1

2

if index.column() not in (12):動作しないでしょう。(12)と同じで12、できませんfoo in 12。それはTypeError. できますfoo in (12,)が、必要はありません。それは簡単foo == 12です。

setDataTrueまたはFalseを返す必要がありsuccessますが、 と を返しQtCore.Qt.UncheckedていますQtCore.Qt.Checked。それはうまくいきません。

を表示したくない場合は、 for を返すだけ0/1でそれを行う必要があります。dataNoneDisplayRole

これはあなたが望むことをするはずです:

class EditableShoSqlModel(QtSql.QSqlQueryModel):
    def __init__(self, parent=None):
        super(EditableShoSqlModel, self).__init__(parent)


    def flags(self, index):
        flags = super(EditableShoSqlModel, self).flags(index)
        if index.column() == 12:
            flags |= QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
        return flags


    def data(self, index, role=QtCore.Qt.DisplayRole):
        if index.column() == 12:
            value = super(EditableShoSqlModel, self).data(index, QtCore.Qt.DisplayRole)
            if role == QtCore.Qt.CheckStateRole:
                if value != 0:
                    return QtCore.Qt.Checked
                else:
                    return QtCore.Qt.Unchecked
            else:
                return None

        return super(EditableShoSqlModel, self).data(index, role)


    def setData(self, index, value, role):
        if index.column() == 12 and role == QtCore.Qt.CheckStateRole:
            # `id` is a built-in function
            id_ = self.data(self.index(index.row(), 0)).toString()
            state, ok = value.toInt()
            if state == QtCore.Qt.Checked:
                value = 1
            else:
                value = 0
            result = self.setAniStatus(id_, value)
            if result:
                # we modified the db, we need to query again
                self.refresh()
            return result

        # I don't know what `refresh` does. But normally you don't need that
        return False


    def refresh(self):
        # something that re-queries the model.
        #self.setQuery('SELECT * FROM Shot')


    def setAniStatus(self, id_, value):          
        query = QtSql.QSqlQuery()
        sql = "UPDATE Shot SET Ani= {0} WHERE idShot = {1}".format(value, id_)
        query.prepare(sql)
        print 'lastQuery:', query.lastQuery()
        return query.exec_()
于 2012-11-02T09:11:16.393 に答える