0

QAbstractTableModel を継承する編集可能なモデルがあります。それに合わせてカスタムデリゲートも用意してください。これは私の最初の編集可能なモデルで、何かが足りないと思います。私は Nokia で見つかった例にほぼ従っています。私のモデルは、データが 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アイテムをダブルクリックしたときに基づいてエディターを表示したい場合checkBoxは、createEditorメソッドでを作成し、とを使用しcheckBoxます。setEditorDatasetModelData

于 2013-01-15T09:14:08.610 に答える