Missing QAbstractItemModel.multiData binding
Phil Thompson
phil at riverbankcomputing.com
Tue Aug 29 13:59:17 BST 2023
Can you create a short complete example I can use?
Thanks,
Phil
On 29/08/2023 13:40, Charles wrote:
> I tried using multiData with this code snippet but it seems to crash
> when
> setting roleData.setData(...). Also I notice that the role values might
> be
> negative. (Btw, ic is icecream print).
>
> def _itemData(self, item, col):
> match col.name:
> case 'code':
> return {
> Qt.DisplayRole: item.code,
> }
> case 'earnings_chg':
> return {
> Qt.DisplayRole: f'{item.earnings_chg}%',
> }
> case 'time':
> return {
> Qt.DisplayRole: item.time.strftime('%Y-%m-%d'),
> }
> case 'earnings':
> return {
> Qt.DisplayRole: formatMoney(item.earnings),
> }
>
> def multiData(self, index, roleDataSpan):
> ic(index, roleDataSpan)
> item = self._items[index.row()]
> col = self.COLUMNS[index.column()]
> itemData = self._itemData(item, col)
> for roleData in roleDataSpan:
> role = roleData.role()
> ic(role)
> if value := itemData.get(role):
> roleData.setData(value)
> else:
> match role:
> case Qt.FontRole:
> roleData.setData(style.TABLE_FONT)
> case Qt.TextAlignmentRole:
> align = col.align
> if align == 'C':
> roleData.setData(Qt.AlignCenter)
> elif align == 'R':
> roleData.setData(Qt.AlignVCenter |
> Qt.AlignRight)
>
> ic| earnings.py:66 in multiData()
> index: <PyQt6.QtCore.QModelIndex object at 0x000001D17B77D000>
> roleDataSpan: <PyQt6.QtCore.QModelRoleDataSpan object at
> 0x000001D17B77D4D0>
> ic| earnings.py:72 in multiData()- role: 6
> ic| earnings.py:72 in multiData()- role: 7
> ic| earnings.py:72 in multiData()- role: 9
> ic| earnings.py:72 in multiData()- role: 10
> ic| earnings.py:72 in multiData()- role: 1
> ic| earnings.py:72 in multiData()- role: 0
> ic| earnings.py:72 in multiData()- role: 8
> ic| earnings.py:72 in multiData()- role: -948493808
> ic| earnings.py:72 in multiData()- role: 1897532384
> ic| earnings.py:72 in multiData()- role: 1897532384
> ic| earnings.py:72 in multiData()- role: 2033014364
> ic| earnings.py:72 in multiData()- role: 2
> ic| earnings.py:72 in multiData()- role: 16777216
> ic| earnings.py:72 in multiData()- role: 1893028080
> ic| earnings.py:72 in multiData()- role: 1897532384
> ic| earnings.py:72 in multiData()- role: 1897532384
> ic| earnings.py:72 in multiData()- role: 2033014458
> ic| earnings.py:72 in multiData()- role: 2
> ic| earnings.py:72 in multiData()- role: 2033021932
> ic| earnings.py:72 in multiData()- role: 3
> ic| earnings.py:72 in multiData()- role: 524288
> ic| earnings.py:72 in multiData()- role: 1893028080
> ic| earnings.py:72 in multiData()- role: 1897532384
> ic| earnings.py:72 in multiData()- role: 1897532384
> ic| earnings.py:72 in multiData()- role: 2033022038
> ic| earnings.py:72 in multiData()- role: 1
> ic| earnings.py:72 in multiData()- role: 22528
> ic| earnings.py:72 in multiData()- role: 1893028080
>
> On Sun, Aug 27, 2023 at 10:45 PM Phil Thompson
> <phil at riverbankcomputing.com>
> wrote:
>
>> On 14/08/2023 16:21, Jakub Fránek wrote:
>> > Hello
>> >
>> > I am working on a PyQt app that features a large QTableView driven by a
>> > custom QAbstractTableModel implementation. Profiling shows that even
>> > after
>> > heavy optimization, the program spends a lot of time calling
>> > QAbstractItemModel.data method.
>> >
>> > I think that QAbstractItemModel.multiData method could improve the
>> > performance considerably, however it seems that PyQt does not support
>> > this
>> > binding (since it does not even support QModelRoleDataSpan).
>> >
>> > My question is: is there any plan of supporting
>> > QAbstractItemModel.multiData method in the future? If there is no such
>> > plan
>> > yet, I would like to cast my vote and humbly request this binding in
>> > some
>> > future version of PyQt.
>>
>> multiData() and QModelRoleSpan are implemented in the next snapshot -
>> please test.
>>
>> Phil
>>
More information about the PyQt
mailing list