Thanks guys,

I did get it to work but will try and refactor to use the model's signals to learn better habits.

Cheers,
frank

On 5/08/16 3:30 AM, Baz Walter wrote:
On 04/08/16 05:31, Frank Rueter | OHUfx wrote:
Hi,

I am writing a custom view for a simple data model and need to have a
custom widget change it's background colour when it's associated
QStandardItem has a certain attribute. I thought I'd simply subclass
QStandardItem, give it the custom attribute, e.g. isSelected, then a
method called setSelected() which sets the attribute's value and
emits a selectionChanged signal, to which I can connect the
associated widget's slot that changes the background colour. So this
is what I have for the item:

class ElemItem(QtGui.QStandardItem): selectionChanged =
QtCore.Signal(bool)

def __init__(self, elementData): super(ElemItem,
self).__init__(elementData) self.isSelected = False self.filePath =
elementData

def setSelected(self, selected): self.isSelected = selected
selectionChanged.emit(selected)


However, since QStandardItem doesn't inherit QObject it doesn't seem
to be able to emit a signal. When I try something like this in the
widget: self.item.selectionChanged.connect(self.markAsSelected)

I get this error: AttributeError: 'PySide.QtCore.Signal' object has
no attribute 'connect'


Is this the entirely wrong way of achieving what I'm after? I can
achieve what I'm after in other ways but would like to understand
this hiccup before moving on, so any input would be welcome.

Yes, it is the wrong way. There is already an API that *almost* does exactly what you want. If the item has been added to a model, its setData() method will emit the model's itemChanged signal whenever the value of the data changes. However, this signal is quite poorly designed, because although it sends the *item* that changed, it does not also send the *role* that changed. If it did the latter, you could just set your special attribute using a custom role, and then test for that role in a slot connected to the model's itemChanged signal.

It's really a shame that the existing API doesn't work as it should, but it shouldn't be too difficult to add a similar API of your own that does the right thing. The key is to use the QStandardItem.model() method to get access to the parent model (which would then allow you to emit a custom signal defined on that model).

--
Regards
Baz Walter

_______________________________________________
PySide mailing list
PySide@qt-project.org
http://lists.qt-project.org/mailman/listinfo/pyside

Reply via email to