[Interest] dynamic widget creation in QScrollArea

Frank Rueter | OHUfx frank at ohufx.com
Mon Aug 8 06:28:48 CEST 2016


Hi Bo,

I have followed your advise and gone back to QListView with a delegate.
My first test was to render the custom widget I need via the delegate 
paint method. This populates a static version of the movie player (the 
custom widget I need).
Then, also in the delegate's paint method, I use setItemWidget if the 
mouse hovers over the item, to get the fully fledged and interactive widget.
This seems to be promising but it kinda feels wrong to set an item 
widget in the paint method. Should I worry?

Also, I can't get the rendered image to line up with the item widget 
itself. The render seems to have the correct size but the widget, when 
the mouse hovers over the item, is slightly off, causing the item to pop 
a little and leave out-of-date paint artifacts when the mouse leaves again.

Below is my test code for the delegate.

Now I am wondering if the below approach is acceptable (setting an item 
widget inside the delegate's paint event).
Alternatively I'm wondering if I could/should use the delegate's 
createEditor method to display the widgets of all visible items to 
achieve the same thing (which is full interactive and animated widget in 
all visible items). I have, however, not been able to figure out how to 
call the editor on mouse enter, which I need because the movie is 
supposed to play when the mouse hovers over it.

Any opinions on this?

Cheers,
frank


class DelegateOld(QtGui.QItemDelegate):

     def __init__(self, parent = None):

         super(Delegate, self).__init__(parent)
         self.thumbnail = None

     def paint(self, painter, option, index):
         item = index.model().itemFromIndex(index)
         self.thumbnail = MyMovie(item)

         if option.state & QtGui.QStyle.State_MouseOver:
             # swap render for actual widget here. So the user can 
interact with it - doesn't feel right though to do this in the paint event
             existingThumb = self.view.indexWidget(index)
             if not existingThumb:
                 self.view.setIndexWidget(index, self.thumbnail)
         else:
             self.thumbnail.render(painter, 
QtCore.QPoint(option.rect.x(), option.rect.y()))

     def sizeHint(self, option, index):
         return MyMovie.thumbSize

On 4/08/16 8:36 pm, Bo Thorsen wrote:
> Den 04-08-2016 kl. 10:05 skrev Frank Rueter | OHUfx:
>> I am playing with the idea of writing a custom widget based on
>> QScrollArea, where widgets are created as the user scrolls.
>> I'm just hoping to bounce the general idea of you guys here to see if
>> I'm heading in the right direction:
>>
>> I have a heap of custom widgets, potentially thousands, depending on the
>> contents of a database.
>> I'd like to show them in a grid that fits as many widgets horizontally
>> as will fit in the current window size (dynamic).
>> I would also like smooth vertical scrolling.
>>
>> If I create a single parent widget with a grid layout that creates all
>> widgets on start up, it takes ages.
>> So I'm thinking if I use the child widgets' visibleRegion() to find the
>> ones currently visible in the scroll area, then figure out the indexes
>> of the widgets in the rows above and below to create them dynamically,
>> that should speed up the startup and still provide smooth scrolling.
>>
>> Obviously I'd have to manually scale the scroll area based on the
>> maximum amount of widgets and the parent widget's width to get an
>> indicative scrollbar.
>> Not sure how tricky that will be.
>>
>> Does that sound crazy or doable?
>>
>> Basically I am trying to re-create the behavior of a QListView in icon
>> mode. I tried using QListView with delegates, but couldn't get the
>> delegates to provide the kind of complexity I need for the child widgets
>> which I have already written (which are basically mini movie players
>> that can be drag&dropped and have playback all at once on demand).
>>
>> Any thoughts on this before I dive into this little experiment?
>
> I don't think that sounds unreasonable. If I were you, I would try 
> very hard to stay with QListView instead, but other than that it 
> doesn't sound hard to do. Time consuming, yes, but not difficult.
>
> Bo Thorsen,
> Director, Viking Software.
>

-- 
ohufxLogo 50x50 <http://www.ohufx.com> 	

*vfx for storytellers <http://www.ohufx.com>*

*vfx compositing <http://ohufx.com/index.php/vfx-compositing> | 
*workflow customisation & consulting 
<http://ohufx.com/index.php/vfx-customising>**

*W E L L I N G T O N    |    N E W   Z E A L A N D *

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160808/7247d5e3/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/20160808/7247d5e3/attachment.png>


More information about the Interest mailing list