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