How to connect events from QAbstractItemDelegate widget?
-
Hi,
I have a widget containing a QTreeView with a QStyledItemDelegate in column 0 creating a QSpinBox editor.
I would like to display in a QLabel and in real time the value of the QSpinBox each time it changes (so when QSpinBox::valueChanged(int) signal is emitted, for example when the mouse wheel is used inside the QSpinBox or up/down buttons are clicked).Does someone know how to do such a connection between QStyledItemDelegate and the QLabel?
Thanks in advance for your response.
Best regards.
Pascal -
Easiest is to take control of the actual creation of the QSpinBox. For instance, by subclassing QStyledItemDelegate, and reimplementing the createEditor method like this:
@
QWidget* MyDelegate::createEditor( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
//let the base class do the hard work
QWidget editor = QStyledItemDelegate::createEditor(parent, option, index);QSpinBox* spinbox = qobject_cast<QSpinBox*>(editor);
if (spinbox) {
connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onSpinboxValueChanged(int)));
}return editor;
}
@ -
Dear franku & Andre, thanks for your response.
To Andre: "spinbox" is NULL using qobject_cast.
But I finally wrote this code which works:
@
QWidget * AngleDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setMinimum(0);
editor->setMaximum(359);
connect(editor, SIGNAL(valueChanged(int)), this, SIGNAL(valueChanged(int)));return editor;
}
@I resend the "QSpinBox::valueChanged()" signal outside my delegate and can then connect any QObject (like a QLabel) to the "AngleDelegate::valueChanged()" signal.
Problem solved.
Thanks again.
Bye
Pascal -
Hello there, pin..
I have a similar problem and I can't figure out how to solve the connect thing, maybe you can give me a hand on it.
I have a QTableView inherited and also a QStyledItemDelegate inherited so I can change them as needed.
One of the columns has a widget (QSlider) that I paint using drawComplexControl from QStyle and I create the real QSlider to edit when the editor opens. In the other column I store the value of this slider.
The problem is that I can't figure out how to keep the value updated in real-time, because now I can only update it when setModelData is called.
I can't figure how to connect the signal valueChanged to a slot of mine that would then update the desired item in the table view (that would be in the same row but another column).
I don't think any code is relevant because I have the same structure as you with createEditor but here it goes:
Here I create the slider, the commented line is what would be my connect (but where should I use the slot or signal I'd call/emit?)
[code]QWidget *HsSubunitConfigurationDelegate::createEditor(QWidget *parent, const StyleOptionViewItem &option, const QModelIndex &index) const{
QSlider slider = new QSlider(Qt::Horizontal, parent);
/ connect(slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int))); */
slider->setAutoFillBackground(true);
return slider;
}[/code]Here I set the data for both the item that hold the widget (I can't get from the value column I want to update because I decode the value in a string later on and I don't feel like decoding it back to a value) and then I set the value to the column I want to be updated in real-time:
[code]void HsSubunitConfigurationDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{
QSlider slider = qobject_cast<QSlider>(editor);
model->setData(index, slider->value(), Qt::UserRole+12);
model->setData(model->index(index.row(), 3), slider->value(), Qt::DisplayRole);
}
[/code]Sorry if I forgot to post any code or if I wasn't clear.. if you don't understand my problem I can try to ask it again in other words. Also sorry for any misspelling.
Thanks in advance.