Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. French
  4. Problème avec le délégué QSlider
QtWS25 Last Chance

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

Scheduled Pinned Locked Moved Unsolved French
2 Posts 2 Posters 551 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    lacombe
    wrote on 19 Jun 2019, 17:19 last edited by
    #1

    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);
        }
    }
    
    
    1 Reply Last reply
    0
    • M Offline
      M Offline
      mpergand
      wrote on 20 Jun 2019, 17:21 last edited by
      #2

      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

      1 Reply Last reply
      0

      1/2

      19 Jun 2019, 17:19

      • Login

      • Login or register to search.
      1 out of 2
      • First post
        1/2
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved