Название: Отцентровать Checkbox делегата в ячейке QTableView
Отправлено: crazymonkey от Май 27, 2015, 16:37
Добрый день. Есть QCheckBox с моделью с делегатом. Делегат описан следующим образом: class BoxChannelItemDelegate : public QStyledItemDelegate{ Q_OBJECT public: explicit BoxChannelItemDelegate(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 QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{ qDebug() << Q_FUNC_INFO; qDebug() << index.data(); if (index.column() == 0){ QCheckBox* checkbox = new QCheckBox(parent);
checkbox->setChecked(index.data().toBool()); return checkbox; } return parent; }
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const{ if (index.column() == 0){ QCheckBox* checkbox = qobject_cast<QCheckBox*>(editor); checkbox->setChecked(index.data().toBool()); } }
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{ qDebug() << Q_FUNC_INFO; if (index.column() == 0){ QCheckBox *checkbox = qobject_cast<QCheckBox*>(editor); model->setData(index,checkbox->isChecked()); } }
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const{ qDebug() << Q_FUNC_INFO; editor->setGeometry(option.rect); }
};
при этом в модели флаги для нулевого столбца указаны как Checkable if(index.column() == 0) { return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable | Qt::ItemIsEditable; }
И вроде всё хорошо. Он отображает checkbox в ячейке. Но при нажатии на ячейку для редактировани, виджет checkboх создаётся прижатым к правому краю. Как бы его отцентровать? Отображение (http://cs625420.vk.me/v625420604/10ddb/hAZpf1-53Vg.jpg) Редактирование (http://cs625420.vk.me/v625420604/10de2/PSWpwf-VC0Y.jpg)
Название: Re: Отцентровать Checkbox делегата в ячейке QTableView
Отправлено: crazymonkey от Май 27, 2015, 17:13
Если кто ещё искать будет, вот ответ: Как вариант создать - class CenterAlignedCheckbox: public QWidget{ Q_OBJECT QCheckBox* checkbox; public: CenterAlignedCheckbox(QWidget* parent):QWidget(parent){ 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);} };
И использовать в качестве editora в делегате именно его ;)
Название: Re: Отцентровать Checkbox делегата в ячейке QTableView
Отправлено: gil9red от Май 27, 2015, 17:42
Если кто ещё искать будет, вот ответ: Как вариант создать - class CenterAlignedCheckbox: public QWidget{ Q_OBJECT QCheckBox* checkbox; public: CenterAlignedCheckbox(QWidget* parent):QWidget(parent){ 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);} };
И использовать в качестве editora в делегате именно его ;) В общем, без создания новой сущности будет так: C++ (Qt) virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{ if (index.column() == 0){ QCheckBox* checkbox = new QCheckBox(); checkbox->setChecked(index.data().toBool()); QWidget * editor = new QWidget(parent); QHBoxLayout * layout = new QHBoxLayout(); layout->addWidget(checkbox,0,Qt::AlignCenter); editor->setLayout(layout); return editor; } return parent;
Название: Re: Отцентровать Checkbox делегата в ячейке QTableView
Отправлено: Fregloin от Май 28, 2015, 10:05
Если вам нужен только чекбокс, может нет смысла писать для этой колонки делегат? И просто возвращать AlignRole соответствующий в data().
Название: Re: Отцентровать Checkbox делегата в ячейке QTableView
Отправлено: GreatSnake от Май 28, 2015, 10:35
Если вам нужен только чекбокс, может нет смысла писать для этой колонки делегат? И просто возвращать AlignRole соответствующий в data().
AlignRole применима к расположению текста, а не check-mark-а :(
Название: Re: Отцентровать Checkbox делегата в ячейке QTableView
Отправлено: Fregloin от Май 28, 2015, 13:39
хм, тогда наверное только через делегат.
|