Ole wrote:
My interpretation of this is:
- the FigureCanvas gets the first resize event and repaints itself (*)
- during the repaint it gets the second resize event
- since it is already in the repaint process, the second request
 is ignored (or queued) and returns immediately
- this leads to the processing of the second resize for the scrollbar
- after the first repaint (*) is finished, the first resize of the
 scrollbar is started

Remember, this is not a multi-threaded system.  You can't receive a second 
repaint event while the drawing code is happening because the event loop is not 
in a separate thread.  You can make calls that will put a repaint event on the 
X event queue.  When the resize code is finished, the event queue will then be 
processed in the order they were received.   I'd guess that something in your 
repaint/drawing code is changing the size of the widgets which is probably 
should not be doing.




From: Darren Dale [mailto:dsdal...@gmail.com]
Sent: Thursday, May 28, 2009 8:57 AM
To: Ole Streicher
Cc: matplotlib-users@lists.sourceforge.net
Subject: Re: [Matplotlib-users] Strange resize behaviour for qt backend

On Thu, May 28, 2009 at 7:55 AM, Ole Streicher 
<ole-usenet-s...@gmx.net<mailto:ole-usenet-s...@gmx.net>> wrote:
Hi again,

is there no idea on this topic? Does the update work for you as it
should?

I am really busy with other things, and can't offer suggestions unless you post 
a short, simple, standalone script that demonstrates the problem.

Darren


I started to debugging it a bit by adding debug output to the
moveEvent()/resizeEvent() functions. I seems that the resizeEvents
(resp. moveEvents) come out of order. The following comes when one
resizes the window width:

figure resize to  PyQt4.QtCore.QSize(803, 474) <-- first event
figure resize to  PyQt4.QtCore.QSize(879, 474) <-- second event
scroll resize to  PyQt4.QtCore.QSize(879, 15)  <-- second event (wrong!!)
scroll resize to  PyQt4.QtCore.QSize(803, 15)  <-- first event

My interpretation of this is:
- the FigureCanvas gets the first resize event and repaints itself (*)
- during the repaint it gets the second resize event
- since it is already in the repaint process, the second request
 is ignored (or queued) and returns immediately
- this leads to the processing of the second resize for the scrollbar
- after the first repaint (*) is finished, the first resize of the
 scrollbar is started

Who should be blamed for that? Is it
- Qt since they dont distribute the events in the order of occurrence to
 the layout childs?
- or FigureCanvas since it returns from the secons call while the first
 one is not finished yet?

How can I workaround this?

Best regards,

Ole

Ole Streicher <ole-usenet-s...@gmx.net<mailto:ole-usenet-s...@gmx.net>> writes:
> Hi,
>
> I am using matplotlib for some data vizualization. To ensure a
> consistent user interface among the whole application, I do the
> scrolling/zooming stuff myself. So, for a diagram, a horizontal
> scrollbar is displayed below the diagram that enabled to shift along the
> x axis. This is (part of) the code:
>
> ------------------------8<-----------------------------------------------
> from PyQt4 import QtGui, QtCore
> from matplotlib.figure import Figure,SubplotParams
>
> class DiagramWidget(QtGui.QWidget):
>     def __init__(self, parent):
>         QtGui.QWidget.__init__(self, parent)
>         layout = QtGui.QVBoxLayout(self)
>         self.diagram = InnerDiagramWidget(self)
>         self.scrollbar = QtGui.QScrollBar(QtCore.Qt.Horizontal, self)
>         self.connect(self.scrollbar, QtCore.SIGNAL('valueChanged(int)'),
>                      self.diagram.scroll_event)
>         layout.addWidget(self.diagram)
>         layout.addWidget(self.scrollbar)
> # ...
>
> class InnerDiagramWidget(FigureCanvas):
>     def __init__(self, parent):
>         fig = Figure(facecolor = 'w',
>                      subplotpars = SubplotParams(left = 0.08, right=0.96,
>                                                  bottom = 0.1, top=0.98))
>         self.axes = fig.add_subplot(111)
>         FigureCanvas.__init__(self, fig)
>         FigureCanvas.setParent(self, parent)
>         FigureCanvas.setSizePolicy(self,
>                                    QtGui.QSizePolicy.Expanding,
>                                    QtGui.QSizePolicy.Expanding)
>         FigureCanvas.updateGeometry(self)
>
>     def scroll_event(self, x):
>         pass # here is real code ofcourse
> # ...
> ------------------------8<-----------------------------------------------
>
> However, when I put this DiagramWidget into a window and try to resize
> it vertically by mouse (with some data ... about 4000 points), the
> scrollbar is not alwas shown correctly.
>
> One can see that the diagram widget size does not change with every mouse
> move, and the scrollbar sometimes goes out of the visible window, where
> it is unusable.
>
> The similar occurres in the horizontal direction: sometimes the
> scrollbar gets not updated properly. This is the case when the Figure
> canvas takes a long time for update.
>
> If I put the scrollbar on top of the widget, everything is fine, except
> that is the wrong place for a scrollbar :-)
>
> Is this a bug in FigureCanvas, in Qt or in my code? How can I debug and
> solve this?
>
> Best regards
>
> Ole
>
>
> ------------------------------------------------------------------------------
> Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
> is a gathering of tech-side developers & brand creativity professionals. Meet
> the minds behind Google Creative Lab, Visual Complexity, Processing, &
> iPhoneDevCamp as they present alongside digital heavyweights like Barbarian
> Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com


------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, &
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net<mailto:Matplotlib-users@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/matplotlib-users



--
"In our description of nature, the purpose is not to disclose the real essence 
of the phenomena but only to track down, so far as it is possible, relations 
between the manifold aspects of our experience" - Niels Bohr

"It is a bad habit of physicists to take their most successful abstractions to 
be real properties of our world." - N. David Mermin

"Once we have granted that any physical theory is essentially only a model for 
the world of experience, we must renounce all hope of finding anything like the 
correct theory ... simply because the totality of experience is never 
accessible to us." - Hugh Everett III

No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 8.5.339 / Virus Database: 270.12.43/2138 - Release Date: 05/27/09 
18:21:00
------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com 
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to