I don't have debuggin symbols installed, but I am consistently getting
a seg fault after calling the python slot connected to SIGNAL('PyObject
*') from a QWidget subclass. I am usually passing a python string with
the signal, but if I pass None instead, it doesn't crash. I have a
button group emitting clicked(QAbstractButton *), which emits this
signal.<br>
<br>
the connecting code is as follows (sorry for the length), good luck:<br>
<br>
<br>
import os<br>
from PyQt4.QtCore import QObject, SIGNAL<br>
from PyQt4.QtGui import QPushButton, QApplication, QWidget, QHBoxLayout<br>
from PyQt4.QtGui import QButtonGroup, QPalette, QColor<br>
<br>
# ~/.pksampler<br>
PATCH_DIR = os.path.join(os.environ['HOME'], '.pksampler')<br>
LAYERS = ['bass', 'drums', 'lead', 'misc', 'pads']<br>
<br>
<br>
def find_patches():<br>
&nbsp;&nbsp;&nbsp; patches = [i for i in os.listdir(PATCH_DIR)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if os.path.isdir(os.path.join(PATCH_DIR, i))]<br>
&nbsp;&nbsp;&nbsp; return patches<br>
<br>
<br>
def extension(fpath):<br>
&nbsp;&nbsp;&nbsp; &quot;&quot;&quot; return the extension of fpath, not including the . &quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp; return fpath[fpath.rfind('.')+1:]<br>
<br>
<br>
def can_open(fpath):<br>
&nbsp;&nbsp;&nbsp; exists = os.access(fpath, os.R_OK)<br>
&nbsp;&nbsp;&nbsp; supported = extension(fpath) in ('wav', 'aiff')<br>
&nbsp;&nbsp;&nbsp; return exists and supported<br>
<br>
<br>
class PatchSelector(QWidget):<br>
&nbsp;&nbsp;&nbsp; def __init__(self, parent=None):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QWidget.__init__(self, parent)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Layout = QHBoxLayout(self)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.group = QButtonGroup(self)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.buttons = []<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for index, name in enumerate(find_patches()):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button = QPushButton(name)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; palette = QPalette(button.palette())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; palette.setColor(QPalette.Button,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
QColor('grey').dark(150))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button.setPalette(palette)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.group.addButton(button)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.group.setId(button, index)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.buttons.append(button)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Layout.addWidget(button)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QObject.connect(self.group,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
SIGNAL('buttonClicked(QAbstractButton *)'),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
self.clicked)<br>
<br>
&nbsp;&nbsp;&nbsp; def clicked(self, button):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = str(button.text())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.selected = name<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.emit(SIGNAL('selected(PyObject *)'), name)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #self.emit(SIGNAL('selected()'))<br>
<br>
<br>
class Patch:<br>
<br>
&nbsp;&nbsp;&nbsp; name = None<br>
&nbsp;&nbsp;&nbsp; layers = None<br>
<br>
&nbsp;&nbsp;&nbsp; def __init__(self, name):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://self.name">self.name</a> = name<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.homedir = os.path.join(PATCH_DIR, name)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.layers = {}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for layer in LAYERS:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.layers[layer] = []<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpath = os.path.join(self.homedir, layer)<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.path.isdir(lpath):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.layers[layer] = []<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for fname in os.listdir(lpath):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
print 'LPATH',lpath<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
# THIS CRASHES IF I ENABLE THESE **************************8<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp; fpath = os.path.join(lpath, fname)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp; print 'FPATH',fpath<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp; #if can_open(fpath):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; self.layers[layer].append(fpath)<br>
<br>
if __name__ == '__main__':<br>
&nbsp;&nbsp;&nbsp; import sys<br>
&nbsp;&nbsp;&nbsp; def selected(name):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Selected:',name, Patch(name)<br>
&nbsp;&nbsp;&nbsp; a = QApplication(sys.argv)<br>
&nbsp;&nbsp;&nbsp; w = PatchSelector()<br>
&nbsp;&nbsp;&nbsp; QObject.connect(w, SIGNAL('selected(PyObject *)'), selected)<br>
&nbsp;&nbsp;&nbsp; #QObject.connect(w, SIGNAL('selected()'), selected)<br>
&nbsp;&nbsp;&nbsp; w.show()<br>
&nbsp;&nbsp;&nbsp; a.exec_()<br>
<br clear="all"><br>-- <br>Patrick Kidd Stinson<br><a href="http://www.patrickkidd.com/">http://www.patrickkidd.com/</a><br><a href="http://pkaudio.sourceforge.net/">http://pkaudio.sourceforge.net/</a><br><a href="http://pksampler.sourceforge.net/">
http://pksampler.sourceforge.net/</a>