Checkbox and itemdelegate as a table

I am implementing a CheckBox implementation that inherits from QitemDelegate to put it in a QTableView.

the problem is what i get when flush left is inserted and i need it to be centered.

As I understand it, the method that is responsible for Paint. I wrote this as follows:

void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { bool checkValue; QStyleOptionButton BtnStyle; BtnStyle.state = QStyle::State_Enabled; if(index.model()->data(index, Qt::DisplayRole).toBool() == true) { BtnStyle.state |= QStyle::State_On; checkValue = true; }else{ BtnStyle.state |= QStyle::State_Off; checkValue = false; } BtnStyle.direction = QApplication::layoutDirection(); BtnStyle.rect = option.rect; QApplication::style()->drawControl(QStyle::CE_CheckBox,&BtnStyle,painter ); QApplication::style()->drawControl(QStyle::CE_CheckBox,&BtnStyle,painter ); } 

what is missing to be centered?

so I delegated:

.h

 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);} }; class CheckBoxDelegate : public QItemDelegate { Q_OBJECT private: BooleanWidget *checkbox; public: CheckBoxDelegate(QObject *parent); ~CheckBoxDelegate(); void setEditorData( QWidget *editor,const QModelIndex &index )const; void setModelData( QWidget *editor,QAbstractItemModel *model,const QModelIndex &index )const; QWidget *createEditor( QWidget *parent,const QStyleOptionViewItem &/* option */,const QModelIndex &/* index */ )const; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; public slots: void changed( bool ); }; 

.cpp

 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); } 
+4
source share
3 answers

If you extend the QItemDelegate class, it has a drawCheck () function, then name the flag nince, centered. You can use it in the paint () function.

Edit:

Here is an example if you have a class called BooleanEditor that inherits from QItemDelegate :

 void BooleanEditor::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); } 

To keep the checkbox centered when you enter edit mode, you can do something like this:

 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);} }; 

And in your ItemDelegates createEditor () method, return an instance of this BooleanWidget class. In your setModelData () and setEditorData () you can now enter your input widget into this BooleanWidget:

 BooleanWidget * widget = qobject_cast<BooleanWidget*>(editor); 

and then use the is / setChecked method.

+6
source

solved the problem as follows:

considers that it inherits from itemDelegate QStyledItemDelegate and overrides the "paint" and "editorEvent" methods.

The editorEvent method emits a signal indicating which row was selected.

Here is the code

 class ItemDelegate : public QStyledItemDelegate { Q_OBJECT signals: void clickSignal(int); public: ItemDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) { } void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const { QStyleOptionViewItemV4 viewItemOption(option); if (index.column() == 0) { const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; QRect newRect = QStyle::alignedRect(option.direction, Qt::AlignCenter, QSize(option.decorationSize.width() + 5,option.decorationSize.height()), QRect(option.rect.x() + textMargin, option.rect.y(), option.rect.width() - (2 * textMargin), option.rect.height())); viewItemOption.rect = newRect; } QStyledItemDelegate::paint(painter, viewItemOption, index); } virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { Q_ASSERT(event); Q_ASSERT(model); // make sure that the item is checkable Qt::ItemFlags flags = model->flags(index); if (!(flags & Qt::ItemIsUserCheckable) || !(flags & Qt::ItemIsEnabled)) return false; // make sure that we have a check state QVariant value = index.data(Qt::CheckStateRole); if (!value.isValid()) return false; // make sure that we have the right event type if (event->type() == QEvent::MouseButtonRelease) { const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; QRect checkRect = QStyle::alignedRect(option.direction, Qt::AlignCenter, option.decorationSize, QRect(option.rect.x() + (2 * textMargin), option.rect.y(), option.rect.width() - (2 * textMargin), option.rect.height())); } else { return false; } Qt::CheckState state = (static_cast<Qt::CheckState>(value.toInt()) == Qt::Checked ? Qt::Unchecked : Qt::Checked); emit(clickSignal(index.row())); return model->setData(index, state, Qt::CheckStateRole); } }; 

class in which I have a QTableView connection, do the following:

 connect(check,SIGNAL(clickSignal(int)),this,SLOT(CheckMark(int))); //check the itemDelegate 

performed an operation with a check marked

+1
source

what I did to center the editor controls:

 QWidget *checkBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QCheckBox *editor = new QCheckBox(parent); editor->setTristate(allowTriState); //my class' variable // this does the trick :) editor->setStyleSheet("QCheckBox {margin-left: 43%; margin-right: 57%;}"); // this should do it better // editor->setStyleSheet("QCheckBox {margin-left: auto; margin-right: auto;}"); // but in my case the checkbox is slightly to the left of original return editor; } 
+1
source

All Articles