同じ列で選択したすべての値を同時に編集するという問題については、もう少し簡単な解決策があるかもしれません。QTableView :: edit()をオーバーライドする代わりに、ユーザーが編集を送信した後に呼び出されるQTableView :: commitData(editor)をオーバーライドする方が簡単です。
つまり、ユーザーが編集を送信すると、選択した他のすべての行を繰り返し処理し、編集したセルと同じ列のセルにまったく同じ値の変更を適用します。
Pythonの例を次に示します。C++への変換は簡単です(どこにでもセミコロンを追加self
し、に置き換えますthis
):
class ImageTableView(QtGui.QTableView):
def commitData(self, editor):
# call parent commitData first
super(ImageTableView, self).commitData(editor)
# self.currentIndex() is the QModelIndex of the cell just edited
theModel = self.currentIndex().model()
# get the value that the user just submitted
value = theModel.data(self.currentIndex(), QtCore.Qt.EditRole)
curRow, curCol = self.currentIndex().row(), self.currentIndex().column()
# selection is a list of QItemSelectionRange instances
for isr in self.selectionModel().selection():
rows = range(isr.top(), isr.bottom()+1)
for row in rows:
if row != curRow:
# row,curCol is also in the selection. make an index:
idx = theModel.index(row, curCol)
# so we can apply the same value change
theModel.setData(idx, value, QtCore.Qt.EditRole)