1

私は困惑しています。以下のコードでは:

class LineEdit(QtGui.QLineEdit):

def __init__(self, value="", parent=None, commit=None):
    super(LineEdit, self).__init__(parent=parent)
    self.setText("blabla")
    self.commit = commit
    self.editingFinished.connect(self.on_change)
    print self.text()

self.text() は「blabla」ですが、LineEdit にはテキストが表示されず、self.text() の編集後は「」になります。エディターは、QTreeView() の createEditor() を使用して QStyledItemDelegate() で作成されます。

なぜこれが起こるのか、そしてそれを修正する方法を誰かが私に説明できますか?

4

1 に答える 1

4

アイテム デリゲートを使用している場合、エディターに表示される最初のテキストはモデルから取得され、既存のテキストは上書きされます。

編集前後の動作を制御するには、item デリゲートの setEdtorData メソッドと setModelData メソッドを実装します。

class Delegate(QtGui.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        if index.column() < 2:
            return LineEdit(parent)
        return super(Delegate, self).createEditor(parent, option, index)

    def setEditorData(self, editor, index):
        if index.column() == 0:
            editor.setText('blabla')
        elif index.column() == 1:
            editor.setText(index.data().toString())
            # Python 3
            # editor.setText(index.data())
        else:
            super(Delegate, self).setEditorData(editor, index)

    def setModelData(self, editor, model, index):
        if index.column() < 2:
            value = editor.text()
            print(value)
            model.setData(index, value, QtCore.Qt.EditRole)
        else:
            super(Delegate, self).setModelData(editor, model, index)
于 2015-01-10T19:51:13.807 に答える