checkbox column in tableview



  • Hello, what i need is a column of checkboxes in my qtableview.I have reimplemeted QItemDelegate class, got the column but when u click on the checkbox a new Widget appears on screen, but not on top of that cell.
    here is my code :

    CheckBoxDelegate::CheckBoxDelegate(QObject *parent) :
    QItemDelegate(parent)
    {
    }

    void CheckBoxDelegate::changed( bool value )
    {
    BooleanWidget checkbox = static_cast<BooleanWidget>( sender() );
    emit commitData( checkbox );
    emit closeEditor( checkbox );
    }

    QWidget *CheckBoxDelegate::createEditor( QWidget parent,const QStyleOptionViewItem &/ option /,const QModelIndex &/ index */ ) const
    {
    BooleanWidget *editor = new BooleanWidget( parent );
    connect( editor, SIGNAL( toggled ( bool ) ), this, SLOT( changed( bool ) ) );

    return editor;

    }

    void CheckBoxDelegate::setEditorData( QWidget *editor,const QModelIndex &index ) const
    {
    int value = index.model()->data(index, Qt::DisplayRole).toInt();

    BooleanWidget *checkbox = static_cast<BooleanWidget*>(editor);
    
    if(value == 1)
    {
        checkbox->setChecked(true);
    }
    else
    {
        checkbox->setChecked(false);
    }
    

    }

    void CheckBoxDelegate::setModelData( QWidget *editor,QAbstractItemModel *model,const QModelIndex &index ) const
    {
    BooleanWidget checkBox = qobject_cast<BooleanWidget>( editor );
    Qt::CheckState value;

    if(checkBox->isChecked())
        value = Qt::Checked;
    else
        value = Qt::Unchecked;
    
    model->setData( index, value, Qt::DisplayRole);
    

    }

    void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
    drawCheck(painter, option, option.rect, index.data().toBool() ? Qt::Checked : Qt::Unchecked);
    drawFocus(painter, option, option.rect);
    }

    class BooleanWidget : public QWidget
    {
    Q_OBJECT
    QCheckBox * checkBox;

    public:
    BooleanWidget(QWidget * parent = 0)
    {
        checkBox = new QCheckBox(this);
        QHBoxLayout * layout = new QHBoxLayout(this);
        layout->addWidget(checkBox,0, Qt::AlignCenter);
    }
    
    bool isChecked(){return checkBox->isChecked();}
    void setChecked(bool value){checkBox->setChecked(value);}
    

    };
    here is how it looks : http://www.cyberforum.ru/attachments/600091d1447250662

    any help is higly appreciated. Thanks in advance!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.