1

以下のコードは、単一のQTableView. のインスタンスがQAbstractTableModel作成され、モデルとして割り当てられます。最後に、QItemDelegateが に割り当てられQTableViewます。

列 0 には が入力されていQLineEditます。列 1 にはQComboBox. ただしQLineEdit、カスタム テキスト値が割り当てられていQLineEditても、空白のままです。QComboBox「Somewhere」、「Over」、「The Rainbow」の3つのアイテムを正しく取得した場合は発生しません。

ここに画像の説明を入力

列 0 の QLineEdits にテキストを事前入力するにはどうすればよいですか?

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Delegate(QtGui.QItemDelegate):
    def __init__(self):
        QtGui.QItemDelegate.__init__(self)

    def createEditor(self, parent, option, index):
        if index.column()==0:
            lineedit=QtGui.QLineEdit(parent)
            lineedit.setText('Somewhere over the rainbow')
            return lineedit
        elif index.column()==1:
            combo=QtGui.QComboBox(parent)
            combo.addItems(['Somewhere','Over','The Rainbow'])
            combo.setCurrentIndex(index.row())
            return combo

class Model(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self.items = [[1, 'one', None], [2, 'two', None], [3, 'three', None]]

    def rowCount(self, parent=QtCore.QModelIndex()):
        return 3 
    def columnCount(self, parent=QtCore.QModelIndex()):
        return 3

    def data(self, index, role):
        if not index.isValid(): return
        row = index.row()
        column = index.column() 
        if role == QtCore.Qt.DisplayRole:
            return self.items[row][column]

tableModel=Model()
tableView=QtGui.QTableView() 
tableView.setModel(tableModel)
tableView.setItemDelegate(Delegate())

for row in range(tableModel.rowCount()):
    for column in range(tableModel.columnCount()):
        index=tableModel.index(row, column)
        tableView.openPersistentEditor(index)

tableView.show()
app.exec_()

後で編集:

トリックをしてくれたFabioに感謝します。

作業コードは以下に掲載されています。

Delegate.createEditor()メソッド内で値の割り当てを処理する代わりに、代わりに実装する必要がありDelegate.setEditorData(editor, index)ます。内部でsetEditorDataは、次の両方を取得できます。index.column()また、引数を使用してモデルで使用される変数index.row()にアクセスすることもできますself.itemsindexvalue = index.model().items[row][column]

ここに画像の説明を入力

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Delegate(QtGui.QItemDelegate):
    def __init__(self):
        QtGui.QItemDelegate.__init__(self)

    def createEditor(self, parent, option, index):
        if index.column()==0:
            lineedit=QtGui.QLineEdit(parent)
            return lineedit

        elif index.column()==1:
            combo=QtGui.QComboBox(parent)
            return combo

    def setEditorData(self, editor, index):
        row = index.row()
        column = index.column()
        value = index.model().items[row][column]
        if isinstance(editor, QtGui.QComboBox):
            editor.addItems(['Somewhere','Over','The Rainbow'])
            editor.setCurrentIndex(index.row())
        if isinstance(editor, QtGui.QLineEdit):
            editor.setText('Somewhere over the rainbow')

class Model(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]

    def flags(self, index):
        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
    def rowCount(self, parent=QtCore.QModelIndex()):
        return 3 
    def columnCount(self, parent=QtCore.QModelIndex()):
        return 3

    def data(self, index, role):
        if not index.isValid(): return 
        row = index.row()
        column = index.column()
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
            return self.items[row][column]

tableModel=Model()
tableView=QtGui.QTableView() 
tableView.setModel(tableModel)
tableView.setItemDelegate(Delegate())

for row in range(tableModel.rowCount()):
    for column in range(tableModel.columnCount()):
        index=tableModel.index(row, column)
        tableView.openPersistentEditor(index)

tableView.show()
app.exec_()
4

1 に答える 1