QItemDelegate:绘制一个不需要的QCheckBox

时间:2013-01-15 04:57:44

标签: qt qitemdelegate qabstracttablemodel

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

1 个答案:

答案 0 :(得分:0)

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

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

如果您希望在双击某个项目时显示基于QCheckBox的编辑器,则只需在checkBox方法中创建createEditor并使用checkBox setEditorDatasetModelData