Mvvm 为QTableView设置可编辑列
我想在QTableView中设置一个可编辑列,到目前为止,我试图对QTableView进行子类化,并重新实现Mvvm 为QTableView设置可编辑列,mvvm,qt4,Mvvm,Qt4,我想在QTableView中设置一个可编辑列,到目前为止,我试图对QTableView进行子类化,并重新实现Qt::itemlflags flags(const QModelIndex&index)const,子类化QSqlQueryModel和重新实现Qt::itemlflags(const QModelIndex&index)const,最后,子类化qabstractemview,但这会导致出现编译器错误 子类化QTableView: #include "exqtableview.h" E
Qt::itemlflags flags(const QModelIndex&index)const
,子类化QSqlQueryModel和重新实现Qt::itemlflags(const QModelIndex&index)const
,最后,子类化qabstractemview,但这会导致出现编译器错误
子类化QTableView:
#include "exqtableview.h"
ExQTableView::ExQTableView(QWidget *parent) :
QTableView(parent)
{
}
Qt::ItemFlags ExQTableView::flags(const QModelIndex & index) const
{
if (!index.isValid())
return Qt::ItemIsEnabled;
if (index.column() == 2)
return index.parent().flags() & ~Qt::ItemIsEditable;
}
子分类QSqlQueryModel
#include "exsqlquerymodel.h"
ExSqlQueryModel::ExSqlQueryModel(QObject *parent) :
QSqlQueryModel(parent)
{
}
Qt::ItemFlags ExSqlQueryModel::flags( const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 2 )
flags &= ~Qt::ItemIsEditable;
return flags;
}
子分类QAbstractItemView
#include "exitemdelegate.h"
#include <QTableWidgetItem>
ExItemDelegate::ExItemDelegate(QObject *parent) :
QItemDelegate(parent)
{
}
QWidget *ExItemDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem & ,
const QModelIndex & index ) const
{
QTableWidgetItem *item = new QTableWidgetItem;
return item;
}
void ExItemDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
float value = index.model()->data(index, Qt::EditRole).toFloat();
QTableWidgetItem *cell = static_cast<QTableWidgetItem*>(editor);
cell->setData(0, value);
}
void ExItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QTableWidgetItem *cell = static_cast<QTableWidgetItem*>(editor);
float value = cell->data(Qt::DisplayRole);
model->setData(index, value, Qt::EditRole);
}
void ExItemDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &) const
{
editor->setGeometry(option.rect);
}
#包括“exitemdegate.h”
#包括
ExItemDelegate::ExItemDelegate(QObject*parent):
QItemDelegate(家长)
{
}
QWidget*ExItemDelegate::createEditor(QWidget*parent,
常量QStyleOptionViewItem&,
常数QModelIndex和索引)常数
{
QTableWidgetItem*item=新的QTableWidgetItem;
退货项目;
}
void ExItemDelegate::setEditorData(QWidget*编辑器,
常数QModelIndex和索引)常数
{
float value=index.model()->data(index,Qt::EditRole).toFloat();
QTableWidgetItem*单元格=静态转换(编辑器);
单元格->设置数据(0,值);
}
void ExItemDelegate::setModelData(QWidget*编辑器,QBStractItemModel*模型,
常数QModelIndex和索引)常数
{
QTableWidgetItem*单元格=静态转换(编辑器);
浮点值=单元格->数据(Qt::DisplayRole);
模型->设置数据(索引、值、Qt::EditRole);
}
void exitemdegate::updateEditorGeometry(QWidget*编辑器,
常量QStyleOptionViewItem和option,常量QModelIndex和)常量
{
编辑器->设置几何体(option.rect);
}
为什么所有这些方法都无法达到我想要的效果?要使一列可编辑,您应该添加可编辑标志,而不是删除它:
flags |= Qt::ItemIsEditable;
flags()
函数属于模型类,而不是视图,您还有一个完整的示例,演示了如何使QSqlQueryModel
可编辑。