我有一个自定义的qtablemodel和一个qtableview。我想添加一个功能,用户可以选择多行并更改此行中的一个值。他实际上会在所有行中更改此值。 例如当用户选择整个表格时,用户可以更改表格中所有人的姓名。
你能帮助我实现这个目标吗?
我不明白我如何能够为不同的行多次触发模型的setData。或者你能告诉我在调用模型中的setData函数之前qtableview发送给模型的信号是什么?
提前多多感谢 唐尼
答案 0 :(得分:2)
我可能会有一个更直接的解决方案,即同时编辑同一列中所有选定值的问题。而不是重写QTableView :: edit(),更容易覆盖QTableView :: commitData(编辑器),在用户提交编辑后调用它。
简而言之:当用户提交他们的编辑时,迭代所有其他选定的行并将完全相同的值更改应用于与编辑的单元格具有相同列的单元格。
这是一个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)
答案 1 :(得分:0)
根据您已实施模型/视图,您可以将QAbstractItemModel::dataChanged
信号连接到循环浏览每个所选项目的插槽。并非每个版本的setData都会发出此信号,但如果您覆盖它,则可以选择这样做。
以一个例子来看一下QTableWidgetItem :: setData的源代码。它位于qtablewidget.cpp文件中。
编辑:或者,您可以键入代理人的closeEditor或commitData信号来拦截编辑器的值并将其应用于每个选定的项目。您必须将QTableView子类化才能完成此任务,所以这里有一些示例代码可以让您从here开始受到启发:
class MyTableView : public QTableView {
Q_OBJECT
public:
explicit MyTableView(QWidget* parent = 0) : QTableView(parent) {
connect(this->itemDelegate(), SIGNAL(closeEditor(QWidget*)),
this, SLOT(editMultipleItems(QWidget*)));
}
public slots:
void editMultipleItems(QWidget* editor) {
QLineEdit* myeditor = qobject_cast<QLineEdit*>(editor); //recast to whatever widget was actually used
if(myeditor != 0) {
foreach(const QModelIndex& index, this->selectionModel()->selectedIndexes()) {
QVariant v(myeditor->text());
model()->setData(index, v, Qt::EditRole);
}
}
}
};
作为第三个选项,您可以使用特殊情况覆盖QStyledItemDelegate进行多项选择,然后自定义setModelData()以编辑每个所选项目,而不仅仅是接收编辑的项目触发。
您还可以通过使用简单的子类QStyleItemDelegate :: setModelData()发出一个连接到MyTableView的multiItemEdit插槽的信号并使用新值来组合第二个和第三个选项。
答案 2 :(得分:0)
你能不能从QTableView :: selectedIndexes()获取QModelList,并迭代它?