Fragen zum Delegate

Alles rund um die Programmierung mit Qt
Antworten
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Fragen zum Delegate

Beitrag von autip »

Hallo.

Ich habe mir für meine ListView ein Delegate erstellt, das einen QSlider darstellt und double-Werte in meinem Modell speichert.

Soweit funktioniert auch alles. Bei Doppelklick auf ein Item wird der Slider dagestellt, nachdrücken von Enter oder klick auf ein anderes Item verschwindet der Slider und der neue Wert wird durch setModelData im Modell abgespeichert.

Nun komme ich bei folgenden Erweiterungen nicht weiter:
- Neue Werte sollen nicht erst bei Schließen des Delegates im Modell gespeichert werden, sondern bereits während dem verschieben des Sliders
- Der Slider soll als ToolTip immer seinen aktuellen Wert anzeigen



Wie bekomme ich das hin?

Wenn ich beim Signal valueChanged(double) den selbst implementierten Slot onValueChanged(double) aufrufe, fehlen mir die Zeiger auf das Modell und den Index um den neuen Wert im Modell zu Speichern und der Zeiger auf den Slider-Editor um den ToolTip zu überschreiben.

Beim Versuch, diese Zeiger global im Header zu deklarieren (wie ich es in anderen Programmteilen erfolgreich getan ahbe), erhalte ich Fehlermeldungen beim compilieren. Lokal in den Funktionen kann ich sie zwar deklarieren und zuweisen, dann kann ich aber unter onValueChanged nicht darauf zugreifen.

Warum funktioniert das in der Delegate-Klasse nicht wie gewohnt? Wie kann ich es sonst machen?

Hier der Code:


SliderDelegate.h

Code: Alles auswählen

    #ifndef SLIDERDELEGATE_H
    #define SLIDERDELEGATE_H

    #include <QItemDelegate>
    #include <QModelIndex>
    #include <QObject>
    #include <QSize>
    #include <QSlider>


    class SliderDelegate : public QItemDelegate
    {
        Q_OBJECT

    public:

      	virtual ~SliderDelegate();

        SliderDelegate(QObject *parent = 0);

        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const;

        void setEditorData(QWidget *editor, const QModelIndex &index) const;
        void setModelData(QWidget *editor, QAbstractItemModel *model,
                          const QModelIndex &index) const;

        void updateEditorGeometry(QWidget *editor,
            const QStyleOptionViewItem &option, const QModelIndex &index) const;




    public slots:
        void onValueChanged(double value);

    private:
        
      
    };

    #endif


SliderDelegate.cpp

Code: Alles auswählen

    #include "SliderDelegate.h"
    #include "IOWidget.h"
    


    SliderDelegate::SliderDelegate(QObject *parent)
        : QItemDelegate(parent)
    {
//        connect(editor, SIGNAL(valueChanged(double)), this, SLOT(onValueChanged(double)));
    }






    SliderDelegate::~SliderDelegate()
    {
//        disconnect(editor, SIGNAL(valueChanged(double)), this, SLOT(onValueChanged(double)));
    }






    QWidget *SliderDelegate::createEditor(QWidget *parent,
        const QStyleOptionViewItem & option 
       , const QModelIndex & index 
                                         ) const
    {
        QSlider *editor = new QSlider(Qt::Horizontal, parent);
        editor->setTickPosition(QSlider::TicksBelow); //Slider-Markierungen unterhalb des Sliders
        editor->setTickInterval(100); //Abstand der Slider-Markierungen
        editor->setAutoFillBackground(true); //Hintergrund wird gefuellt und ueberlagert die Zahlenwerte
        editor->setTracking (true); //true = Signal valueChanged auch waehrend dem Verschieben / false = Signal nur nach loslassen des Sliders
        editor->installEventFilter(const_cast<SliderDelegate*>(this));

        //MIN/MAX AUS LISTEN ABFRAGEN!!!
        editor->setMinimum(-1000); //Minimalwert
        editor->setMaximum( 1000); //Maximalwert

        return editor;
    }






    void SliderDelegate::setEditorData(QWidget *editor,
                                        const QModelIndex &index) const
    {
        double value = index.model()->data(index, Qt::DisplayRole).toDouble();
        QSlider *slider = static_cast<QSlider*>(editor);
        slider->setValue(value);


        //Dieser ToolTip wird beim Oeffnen der SPinBox gesetzt
        editor->setToolTip(tr("ToolTip %5").arg(value));

        connect(editor, SIGNAL(valueChanged(double)), this, SLOT(onValueChanged(double)));
 
}






    void SliderDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                       const QModelIndex &index) const
    {
        QSlider *slider = static_cast<QSlider*>(editor);
        double value = slider->value();

        model->setData(index, value);
    }






    void SliderDelegate::updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &/* index */ 
                                                                                 ) const
    {
        editor->setGeometry(option.rect);
    }






    void SliderDelegate::onValueChanged(double value)
    {

//      model->setData(currentIndex, value);
      
//      m_pCurrentEditor->setToolTip(tr("ToolTip %5").arg(value));
    }
Antworten