Problème avec le délégué QSlider
Unsolved
French
-
Re: Problème méthode paint du délégué
Merci de votre réponse,
Avec le code suivant que j'ai trouvé dans la doc, le délégué est sans effet. La cellule du slider indique toujours 0%. Si vous pouviez m'indiquer s'il manque quelque chose.
Merci.#include "delegue.h" delegue::delegue(QObject *parent) : QStyledItemDelegate(parent) { } QWidget *delegue::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 1) { QSlider *editor = new QSlider(Qt::Horizontal, parent); editor->setRange(0, 100); editor->setAutoFillBackground(true); return editor; } return QStyledItemDelegate::createEditor(parent, option, index); } void delegue::setEditorData(QWidget *editor, const QModelIndex &index) const { if (index.column() == 1) { QSlider *slider = qobject_cast<QSlider *>(editor); if (slider) { const int value = index.model()->data(index).toInt(); qDebug() <<value; slider->setValue(value); } } else { QStyledItemDelegate::setEditorData(editor, index); } } void delegue::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { if (index.column() == 1) { QSlider *slider = qobject_cast<QSlider *>(editor); if (editor) { model->setData(index, slider->value()); } } else { QStyledItemDelegate::setModelData(editor, model, index); } } void delegue::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); } void delegue::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 1) { painter->save(); QStandardItemModel *modele = new QStandardItemModel(4,2); // modele = index.model(); const int value = index.model()->data(index, Qt::DisplayRole).toInt(); QRect rect(option.rect); const int width = (value * rect.width()) / 100; rect.setWidth(width); QColor c; if (value <= 20) { c = Qt::red; } else if (value <= 50) { c = QColor(240, 96, 0); } else { c = Qt::green; } painter->fillRect(rect, c); QTextOption o; o.setAlignment(Qt::AlignCenter); painter->drawText(option.rect, QString("%1 %").arg(value), o); painter->restore(); } else { QStyledItemDelegate::paint(painter, option, index); } }
-
Si je regarde mon code dans les délégués, la valeur est modifiée dans editorEvent, ex pour un CheckBox:
bool CheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if(event->type()==QEvent::MouseButtonRelease) { QMouseEvent* mouseEvent=dynamic_cast<QMouseEvent*>(event); QFont font=index.data(Qt::FontRole).value<QFont>(); QRect boxRect=calcBoxRect(option.rect,font); if(boxRect.contains(mouseEvent->pos())) { bool extend=index.data(Qt::EditRole).toBool(); model->setData(index,!extend,Qt::EditRole); <---- modifie la valeur ici //sizeHintChanged(index); // force repaint } return true; } return QStyledItemDelegate::editorEvent(event,model,option,index); }
C'est donc à toi d'appeler setData en fonction de la valeur du slider.
L'example Start delegate devrait t'aider:
https://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html