0

我有一个可编辑的模型,它继承了 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 );
}
4

1 回答 1

0

我不太确定你的问题。你想画一个QCheckBox吗?

在您的createEditor方法中,您创建了一个编辑器使用QSpinbox,但在标题中您说它是不需要的。

QCheckBox如果您想在双击项目时显示基于 an 的编辑器,您只需checkBoxcreateEditor方法中创建 a 并使用checkBoxinsetEditorDatasetModelData

于 2013-01-15T09:14:08.610 回答