Problème avec le délégué QSlider



  • 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


Log in to reply
 

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