Fragen zum Delegate
Verfasst: 22. März 2006 15:15
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
SliderDelegate.cpp
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));
}