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
Qt 6.11 is out! See what's new in the release blog

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

Scheduled Pinned Locked Moved Unsolved French
2 Posts 2 Posters 817 Views 1 Watching
  • 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 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 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

      • Login

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