<br><div class="gmail_quote">2010/3/5 Phil Thompson <span dir="ltr">&lt;<a href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div><div></div><div class="h5">On Fri, 5 Mar 2010 00:35:21 +0100, Kiwi &lt;<a href="mailto:spiky.kiwi@gmail.com">spiky.kiwi@gmail.com</a>&gt; wrote:<br>
&gt; Hi,<br>
&gt; I&#39;m totally new to PyQt programming.<br>
&gt; While I was writing a very simple app for the system tray I think I found<br>
a<br>
&gt; bug.<br>
&gt; Here is a simple testcase:<br>
&gt;<br>
&gt; # -*- coding: utf-8 -*-<br>
&gt; import sys<br>
&gt; from PyQt4 import QtGui, QtCore<br>
&gt;<br>
&gt; app = QtGui.QApplication(sys.argv)<br>
&gt;<br>
&gt; tray = QtGui.QSystemTrayIcon()<br>
&gt;<br>
&gt; def a(): pass<br>
&gt; def b(): pass<br>
&gt; def c(): pass<br>
&gt; def d(): pass<br>
&gt; def e(): pass<br>
&gt; def f(): pass<br>
&gt; def g(): pass<br>
&gt; def h(): pass<br>
&gt; def i(): pass<br>
&gt; def j(): pass<br>
&gt; def k(): pass<br>
&gt;<br>
&gt; cm = QtGui.QMenu()<br>
&gt; cm.addAction(&quot;Exit&quot;,QtGui.QApplication.quit)<br>
&gt;<br>
&gt; tray.setContextMenu(cm)<br>
&gt;<br>
&gt; tray.show()<br>
&gt; sys.exit(app.exec_())<br>
&gt;<br>
&gt;<br>
&gt; note that the &quot;defs&quot; are needed to make the crash happen.<br>
&gt; FYI, running linux on x86_64<br>
&gt; versions:<br>
&gt; qt: 4.6.2<br>
&gt; pyqt: 4 4.7<br>
&gt; sip: 4.10<br>
&gt; python: 2.6.4<br>
&gt; gcc: 4.4.3<br>
&gt; libX11 1.3.3<br>
&gt;<br>
&gt; here is the backtrace:<br>
&gt; (gdb) run<br>
&gt; Starting program: /usr/bin/python2.6 crash.py<br>
&gt; [Thread debugging using libthread_db enabled]<br>
&gt; QSystemTrayIcon::setVisible: No Icon set<br>
&gt;<br>
&gt; Program received signal SIGSEGV, Segmentation fault.<br>
&gt; XFreeColormap (dpy=0x0, cmap=16777218) at FreeCmap.c:41<br>
&gt; 41      FreeCmap.c: No such file or directory.<br>
&gt;         in FreeCmap.c<br>
&gt; (gdb) bt<br>
&gt; #0  XFreeColormap (dpy=0x0, cmap=16777218) at FreeCmap.c:41<br>
&gt; #1  0x00007ffff5f1b558 in ~QSystemTrayIconSys (this=0x9c3070,<br>
&gt; __in_chrg=&lt;value optimized out&gt;) at util/qsystemtrayicon_x11.cpp:213<br>
&gt; #2  0x00007ffff5f19ff4 in QSystemTrayIconPrivate::remove_sys<br>
&gt; (this=0x9bc310) at util/qsystemtrayicon_x11.cpp:352<br>
&gt; #3  0x00007ffff5f0637f in ~QSystemTrayIcon (this=0x8c6590,<br>
&gt; __in_chrg=&lt;value optimized out&gt;) at util/qsystemtrayicon.cpp:152<br>
&gt; #4  0x00007ffff65f46f2 in ~sipQSystemTrayIcon (this=0x8c6590,<br>
&gt; __in_chrg=&lt;value optimized out&gt;) at sipQtGuiQSystemTrayIcon.cpp:137<br>
&gt; #5  0x00007ffff65f347c in release_QSystemTrayIcon (sipCppV=0x8c6590,<br>
&gt; sipState=&lt;value optimized out&gt;) at sipQtGuiQSystemTrayIcon.cpp:752<br>
&gt; #6  0x00007ffff219c289 in sipWrapper_dealloc (self=0x0) at siplib.c:9675<br>
&gt; #7  0x00007ffff7adc0e5 in subtype_dealloc (self=0x7ffff7f1caf0) at<br>
&gt; Objects/typeobject.c:1019<br>
&gt; #8  0x00007ffff7aba0cf in insertdict (mp=0x63cf60, key=0x7ffff7f08870,<br>
&gt; hash=2314047222216391292, value=0x7ffff7dab5d0) at<br>
&gt; Objects/dictobject.c:459<br>
&gt; #9  0x00007ffff7abcb15 in PyDict_SetItem (op=0x63cf60,<br>
&gt; key=0x7ffff7f08870, value=0x7ffff7dab5d0) at Objects/dictobject.c:701<br>
&gt; #10 0x00007ffff7abe48d in _PyModule_Clear (m=&lt;value optimized out&gt;) at<br>
&gt; Objects/moduleobject.c:138<br>
&gt; #11 0x00007ffff7b2ac4f in PyImport_Cleanup () at Python/import.c:439<br>
&gt; #12 0x00007ffff7b33c46 in Py_Finalize () at Python/pythonrun.c:434<br>
&gt; #13 0x00007ffff7b33d58 in Py_Exit (sts=0) at Python/pythonrun.c:1714<br>
&gt; #14 0x00007ffff7b33e87 in handle_system_exit () at<br>
Python/pythonrun.c:1116<br>
&gt; #15 0x00007ffff7b340cd in PyErr_PrintEx (set_sys_last_vars=1) at<br>
&gt; Python/pythonrun.c:1126<br>
&gt; #16 0x00007ffff7b345a6 in PyRun_SimpleFileExFlags (fp=0x7fffffffe578,<br>
&gt; filename=0x7fffffffe578 &quot;crash.py&quot;, closeit=1, flags=0x7fffffffe0d0)<br>
&gt; at Python/pythonrun.c:935<br>
&gt; #17 0x00007ffff7b40721 in Py_Main (argc=-134926176, argv=&lt;value<br>
&gt; optimized out&gt;) at Modules/main.c:599<br>
&gt; #18 0x00007ffff74ebbbd in __libc_start_main (main=&lt;value optimized<br>
&gt; out&gt;, argc=&lt;value optimized out&gt;, ubp_av=&lt;value optimized out&gt;,<br>
&gt; init=&lt;value optimized out&gt;,<br>
&gt;     fini=&lt;value optimized out&gt;, rtld_fini=&lt;value optimized out&gt;,<br>
&gt; stack_end=0x7fffffffe1e8) at libc-start.c:220<br>
&gt; #19 0x00000000004006b<br>
&gt; (gdb) f 6<br>
&gt; #6  0x00007ffff219c289 in sipWrapper_dealloc (self=0x0) at siplib.c:9675<br>
&gt; 9675        forgetObject((sipSimpleWrapper *)self);<br>
&gt; (gdb) f 5<br>
&gt; #5  0x00007ffff65f347c in release_QSystemTrayIcon (sipCppV=0x8c6590,<br>
&gt; sipState=&lt;value optimized out&gt;) at sipQtGuiQSystemTrayIcon.cpp:752<br>
&gt; warning: Source file is more recent than executable.<br>
&gt; 752             delete reinterpret_cast&lt;QSystemTrayIcon *&gt;(sipCppV);<br>
&gt; Current language:  auto<br>
&gt; The current source language is &quot;auto; currently c++&quot;.<br>
&gt; (gdb) f 4<br>
&gt; #4  0x00007ffff65f46f2 in ~sipQSystemTrayIcon (this=0x8c6590,<br>
&gt; __in_chrg=&lt;value optimized out&gt;) at sipQtGuiQSystemTrayIcon.cpp:137<br>
&gt; 137     }<br>
<br>
</div></div>Crashes on exit like this are caused by Qt objects being deleted in the<br>
&quot;wrong&quot; order. Unfortunately PyQt has (almost) no control over that order.<br>
By adding those dummy functions you are altering the order in which things<br>
get garbage collected. It doesn&#39;t happen with C++ applications because the<br>
objects don&#39;t get deleted.<br>
<br></blockquote><div><br>I found another problem, which i think is also caused by delete order:<br>######<br>app = QApplication(sys.argv)<br><br>pushButton = QPushButton()<br>gProxyButton =  QGraphicsProxyWidget()<br>gProxyButton.setWidget(pushButton)<br>
<br>view = QGraphicsView()<br>view.show()<br><br>app.exec_()<br>sys.exit()<br>######<br>on exit this program will crash with segfault.<br>but if the proxy widget will be added to the scene, or explicitly deleted afer app.exec_(), all will be fine<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
The workaround is to experiment with explicitly deleting objects after<br>
exec_() returns but before sys.exit() is called. In this case &quot;del tray&quot;<br>
seems to avoid the crash.<br>
<br>
That said, PyQt does have a mechanism for making sure certain objects get<br>
deleted before the QApplication does - and it seems that QSystemTrayIcon<br>
should also be handled that way. The change will be in tonight&#39;s snapshot.<br></blockquote><div> </div><div>So can the problem i described also be fixed the same way, as the OP says (i.e. make QGraphicsProxyWidget deleted before QApplication) ?<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<font color="#888888"><br>
Phil<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
PyQt mailing list    <a href="mailto:PyQt@riverbankcomputing.com">PyQt@riverbankcomputing.com</a><br>
<a href="http://www.riverbankcomputing.com/mailman/listinfo/pyqt" target="_blank">http://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><br>
</div></div></blockquote></div><br>