On 2/23/2013 4:50 AM, Stefan Champailler wrote:
Hello,


I have never seen that kind of issue but what I've learned the hard
way is that memory leaks can cause very erratic behaviours.
So, as a first step, if you didn't already do so, you should make
sure there are no ownership issues in your code. If you have a large
code base, I found it was easier to simply remove the code part
by part until the problem disappear (and so had I a better idea of
the location of the issue).

I also found very instructing to reduce the code to a small piece
to reproduce the bug. Doing so help to learn quite a bit about PySide
(because when you reduce code to a minimum you get to know how to
express some ideas in a much better way).

Either way, I bet you have some work ahead...

stefan


On 02/21/2013 10:22 PM, Joel B. Mohler wrote:
On 2/21/2013 12:52 PM, Zak wrote:
The following idea helped me with a different glitch that was probably unrelated to yours, but who knows, it might help you. Try each of the following:

# Signals and slots example
# From qt_webview_play.py

@Slot(bool)  # bool is PySide.QtCore.bool
def my_slot(input_bool):
    pass

# The following three lines should be equivalent, but they
# are not always equivalent in practice:

q_widget.connect(q_widget, SIGNAL("toggled(bool)"), my_slot)
q_widget.toggled.connect(my_slot)
q_widget.toggled[bool].connect(my_slot)

I don't know why they are different, but sometimes they are. My bug arose when I tried to manually disconnect and reconnect signals, specifically the loadFinished(bool) signal on a QWebView widget.

In my own experience, it is best to always use the first method, with SIGNAL("toggled(bool)"). I notice that the StackOverflow question you linked uses the third method. Try switching it up and see if anything helps.

Thanks for your comments. I think they were helpful, but the bug reproduction process here got pretty weird as I fiddle with this some more. I commonly use method 2 to connect signals and slots (I wasn't aware of method 3, but I think I see it's necessity at times). I changed the one connection to use method 1 and sure enough I think I don't get that failure any more.

(and now just a personal tale of woe this has led me down ...) However, I now see that regardless of signal/slot issues, that if I sit here and open,close,reopen and repeat continuously I'm sure to get signal/slot failures and missing attributes and even segfault crashes sometime in the first 30 open/close iterations. Unfortunately, this widget that I'm closing and reopening has nested sub-widgets probably 4 layers deep and many many nuances. It will take a while to decode this, but it certainly looks like memory corruption. I'm not going to hazard a guess about where to point a finger at this point aside to say that pure python pyside shouldn't segfault.

For the public record in this thread and to indeed confirm Stefan's very accurate statements, I report that the signal/slot issues entirely resolved on their own once I understood the bug which I described at https://bugreports.qt-project.org/browse/PYSIDE-144 . The workaround there was to explicitly create my own QMdiSubWindow explicitly and set my widget with QMdiSubWindow.setWidget. I find this to be an entirely acceptable state of the code for my usage. The moral of the story is that incorrect ownership (somewhere) can indeed cause seemingly arbitrary faults later in the PySide-based application.

Stefan's approach of eliminating code piece by piece is virtually the only way that I've been able to come to grips with this and prior PySide experiences of this nature. This is grotesque, but quick python debug cycles and revision control to know all your slicing & dicing changes make it quite doable.

Joel

_______________________________________________
PySide mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/pyside

Reply via email to