[PySide] can a QStandardItem emit a signal?

Frank Rueter | OHUfx frank at ohufx.com
Thu Aug 4 23:29:29 CEST 2016


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




More information about the PySide mailing list