[Interest] need advise on QStandardItemModel vs. QAbstractTableModel

Frank Rueter | OHUfx frank at ohufx.com
Thu Jan 14 01:12:30 CET 2016


Thanks Andreas, that all makes sense.
Will give the more manual approach some more attention.

Cheers,
frank

On 14/01/16 12:00 pm, Andreas Pakulat wrote:
> Hi,
>
> On Wed, Jan 13, 2016 at 11:07 PM, Frank Rueter | OHUfx 
> <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>
>     Thanks Bo,
>
>     when you say "it's bad in so many ways", are you referring to
>     performance?
>
>     I just realised that my last conversation with Jason had dropped
>     the CC to the list, so here it is again :
>
>         so a few lines into the new code and I believe I'm starting to
>         realise that QAbstractTableModel is the wrong choice for me,
>         let's see if I get this right:
>
>         I need each cell to:
>
>           * store a reference to a custom object in the host application
>           * get it's background and foreground colour from the host
>             application's object
>           * determine the right delegate output based on the data
>             type/ external object class
>           * drive the external object's value upon datatChanged
>           * etc.
>
>         When I got as far as implementing the background role in my
>         QAbstractTableModel's data method, the resulting view took
>         about 4 seconds to resize, while scrolling left me with the
>         ol' spinning beach ball (OSX).
>         The same code utilising QStandarItemModel reacts
>         instantaneously without trouble, even with way more data.
>
>         I suppose this is because I am storing those object references
>         in each QStandarItem as I construct the data when using
>         QStandarItemModel. So later on, those values are readily
>         available within my data model.
>         When putting those references into QAbstractTableModel.data(),
>         they are constantly called upon as the view changes, causing
>         the massive slow down.
>
>         In order to keep the view fast, I need to refactor my code and
>         somehow store the custom data only once, so things like
>         background colour etc. are determined within my model's data
>         when needed, rather than having to call the host application
>         constantly to retrieve the same info.
>         Which essentially turns the table model into an item model,
>         and I might as well use the QStandardItemModel or at least
>         QAbstractItemModel to begin with.
>
>         Does that sound about right?
>
>
>     Bo, reading your reply makes me feel like I should keep playing
>     with QAbstractTableModel (or QAbstractItemModel) and write all the
>     behaviour I need from QStandardItemModel myself?
>     I feel like the item based approach is handier as I can subclass a
>     QStandardItem and give it a reference to the external object it
>     represents, then have the data read/write from/to that.
>     I don't think I get that with a table model unless I re-invent the
>     wheel.
>
>     Any thoughts on the above?
>
>
> First of all: Take this with a grain of salt, I haven't written a 
> custom item model since a few years now and have also not kept up to 
> speed with changes in the QStandardItemModel.
>
> One thing to keep in mind with the item model is that it requires to 
> create an object for each and every item. That onehas a another object 
> as d-pointer which then has a bunch of member variables that also need 
> memory. So depending on what you use from it and how many items you 
> have, your memory footprint increases quite a bit without providing 
> anything that you actually use.
>
> The idea with the custom model is that you only have the data in 
> memory that is really 'stored' and you calculate everything for the 
> view on the fly (like colors etc.) from this bare minimum of data. So 
> the memory footprint can get smaller with this - especially with a 
> huge number of items - but of course it means access to the data must 
> be fast. Or you need to consider to cache some (but not all) of the 
> data 'up front' to make it seem fast (I think this happens - behind 
> the scenes - with sql table models based on queries).
>
> You could still benefit from imlementing a custom model event if it 
> replicates some of the item model's logics. If the struct you use for 
> storing the attributes to be returned from data() is considerably 
> smaller than the qstandarditem class your overall memory footprint 
> might decrease while the performance is kept at par with the standard 
> item model.
>
> Andreas

-- 
ohufxLogo 50x50 <http://www.ohufx.com> 	*vfx compositing 
<http://ohufx.com/index.php/vfx-compositing> | *workflow customisation 
and consulting <http://ohufx.com/index.php/vfx-customising>* *

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160114/d54d0e77/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ohufxLogo_50x50.png
Type: image/png
Size: 2666 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160114/d54d0e77/attachment.png>


More information about the Interest mailing list