QTableView代理退出编辑模式前就修改数据
需求
列表上有一些QComboBox和QDoubleSpinBox,留下来的代码是用的代理(createEditor + setEditorData + setModelData)。
最新的需求需要实时修改。如果是用的代理(paint + editorEvent)或者QTableWidget,这个需求很好实现。
代理(createEditor + setEditorData + setModelData)则是在列表的editorEvent后便判断是否完成修改来发送commitData和sizeHintChanged来实现退出编辑后修改Model的数据。
setEditorData和createEditor都是const修饰的,信号发不出去,index也是const传入的,无法调用setModelData。
不想大该原来的代码,干脆在代理初始化的时候把Model传进去吧。
原文
代码
QWidget *ComboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /*option*/, const QModelIndex &index) const
{
QComboBox *editor = new QComboBox(parent);
editor->addItems(item_list_);
editor->installEventFilter(const_cast<ComboxDelegate *>(this));
connect(editor, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),
this, [&, index](int data) {
model_->setData(index, data, Qt::EditRole);
});
return editor;
}
反思
感觉代理就是为了抽离data和view,像上边那样操作就失去了代理的意义。直接用QTableWidget设置每个单元个的Widget就好了。