我有一个可编辑的模型,它继承了QAbstractTableModel。还有一个自定义委托与它一起使用。这是我的第一个可编辑模型,我想我错过了一些东西。我非常关注诺基亚发现的例子。我的模型告诉代表数据可以通过flags()进行编辑。当我这样做时,它会在单元格中绘制一个QSpinBox。
底层模型是一个简单的std :: map。关键是天,价值是一个比率 通常,在任何可编辑单元格中绘制的内容都是QCheckBox,但是是幻影出来的,然后是数据。如果我双击该值,我会看到编辑器,它恰好是基于QDoubleSpinbox的自定义小部件。
Qt::ItemFlags my_model_t::flags( const QModelIndex& index ) const
{
if ( !index.isValid() ) {
return Qt::NoItemFlags;
}
if ( index.column() == col_rates ) {
return QAbstractItemModel::flags( index ) | Qt::ItemIsEditable;
}
return QAbstractItemModel::flags( index );
}
QVariant my_model_t::data( const QModelIndex& index, int role ) const
{
if ( !index.isValid() ) {
return QVariant();
}
if ( role == Qt::DisplayRole || Qt::EditRole ) {
if ( static_cast<int>( rates.size() ) <= index.row() ) {
return QVariant();
}
int day = vec[index.row()];
if ( index.column() == col_days ) {
return day;
} else if ( index.column() == col_rates ) {
std::map<int, double>::const_iterator it = rates.find( day );
if ( it != rates.end() ) {
return (*it).second;
}
}
}
return QVariant();
}
QWidget* my_delegate_t::createEditor( QWidget* parent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const
{
gui_spinbox* editor = new gui_spinbox( parent );
if ( index.column() == col_rate ) {
const my_model_t* model = static_cast<my_model_t*>( index.model() );
}
return editor;
}
void my_delegate_t::setEditorData( QWidget* editor, const QModelIndex& index ) const
{
double value = index.model()->data( index, Qt::EditRole ).toDouble();
gui_spinbox* spin_box = static_cast<gui_spinbox*>( editor );
if ( spin_box ) {
spin_box->setValue( value );
}
}
void my_delegate_t::setModelData( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index ) const
{
gui_spinbox* spin_box = static_cast<gui_spinbox*>( editor );
if ( spin_box ) {
double value = spin_box->value();
model->setData( index, value, Qt::EditRole );
}
}
void my_delegate_t::updateEditorGemoetry( QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& /*index*/ ) const
{
editor->setGeometry( option.rect );
}
答案 0 :(得分:0)
我不太确定你的问题。你想画一个QCheckBox
吗?
在createEditor
方法中,您使用QSpinbox
创建了一个编辑器,但在标题中,您说它是不受欢迎的。
如果您希望在双击某个项目时显示基于QCheckBox
的编辑器,则只需在checkBox
方法中创建createEditor
并使用checkBox
setEditorData
和setModelData
。