3

私がこれまでに行ったこと:

編集可能なセルを含むカスタムQAbstractTableModel( QTableView-Widget で使用) を実装しています。これらのセルのプロパティは、flags()次のようなメソッドで指定されます。

def flags(self, index):  # Qt was imported from PyQt4.QtCore
    if index.column() < 2:
        return Qt.ItemIsEditable | Qt.ItemIsEnabled | \
               Qt.ItemIsSelectable
    else:
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable

最初の 2 つの列のセルは、私が望むように編集可能としてマークされています。

私がしたいこと:

ただし、セルをダブルクリックして編集をトリガーすると、含まれているテキストが削除され、空のフィールドが表示されます。

セルの編集例

しかし、含まれているテキストが非常に長くなる可能性があり、再入力してはならないため、含まれているテキストを削除して置き換えたくありません。すでに含まれているものを編集したいだけです。ダブルクリックすると、セルは以前に含まれていたテキスト (既に選択されている可能性があります) で編集可能になります。

質問:

どうすればこの動作を実現できますか? flags メソッドを編集して、これらのセルに別のプロパティを指定する必要がありますか?

4

2 に答える 2

3

いくつかのオプションがあります。

Qt.EditRoleモデルの各アイテムにデータを設定していない可能性があるため、編集中にセルにデータが表示されません。はQTableWidgetこれをデフォルトで行います。

これを行う別の方法は、QItemDelegate. これにより、エディター ウィジェットを手動で作成し、 に表示される前に初期化できますQTableView。編集テキストが入力されていない場合は、表示ロール テキストを使用できます。

class MyDelegate(QtGui.QItemDelegate):

    def createEditor(self, parent, option, index):
        if index.column() == 2:
            return super(MyDelegate, self).createEditor(parent, option, index)
        return None

    def setEditorData(self, editor, index):
        if index.column() == 2:
            # Gets display text if edit data hasn't been set.
            text = index.data(Qt.EditRole) or index.data(Qt.DisplayRole)
            editor.setText(text)         

delegate = MyDelegate()
tableview.setItemDelegate(delegate)
于 2016-05-31T17:40:54.337 に答える