Hi again,
is there no idea on this topic? Does the update work for you as it
should?
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-spam@...361...> 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,SubplotParamsclass 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 scrollbarIs 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