Hi,
attached is a sample that works fine in pyqt and segfault in pyside:
1) click sometime the "Click me" button
2) click the "Change widget" button
3) click the "Back" button
4) the application segfault
5) the pyqt version works fine,
thanks
Nicola
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PySide import QtGui, QtCore
from PySide.QtCore import QThread
import time
class globalThreads(QtCore.QObject):
def __init__(self,parent=None):
super(globalThreads, self).__init__(parent)
self.threads=[]
def add(self,t):
self.threads.append(t)
for tr in self.threads:
print tr
self.connect(t, QtCore.SIGNAL("finished()"),self.clean_up)
def clean_up(self):
self.threads.remove(self.sender())
for tr in self.threads:
print tr
thread_global=globalThreads()
class SimpleLongRunningThread(QThread):
def __init__(self,parent=None):
super(SimpleLongRunningThread,self).__init__(parent)
thread_global.add(self)
def run(self):
time.sleep(5)
print 'end esecution'
self.emit(QtCore.SIGNAL('end_esecution'))
class TestWidget(QtGui.QWidget):
def __init__(self,back_widget, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.bw=back_widget
self.test_button = QtGui.QPushButton('Click me', self)
self.test_button.setGeometry(10, 10, 200, 35)
self.test_button1 = QtGui.QPushButton('Change widget', self)
self.test_button1.setGeometry(10, 60, 200, 35)
#self.longThread=SimpleLongRunningThread()
#self.connect(self.longThread, QtCore.SIGNAL("finished()"),
# self.longThread, QtCore.SLOT("deleteLater()"))
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.onClick)
self.connect(self.test_button1, QtCore.SIGNAL('clicked()'),self.onClick1)
def onEndEsecution(self):
print 'signal on end esecution'
def onClick(self):
print 'click'
longThread=SimpleLongRunningThread()
self.connect(longThread, QtCore.SIGNAL('end_esecution'),self.onEndEsecution)
#thread_global.add(longThread)
longThread.start()
def onClick1(self):
print 'change widget from TestWidget'
self.parent().setCentralWidget(self.bw())
class AnotherWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.test_button = QtGui.QPushButton('back', self)
self.test_button.setGeometry(10, 10, 200, 35)
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.onClick)
def onClick(self):
print 'change widget from AnotherWidget'
w=TestWidget(AnotherWidget)
self.parent().setCentralWidget(w)
class MainApp(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('QThread demo')
t=TestWidget(AnotherWidget)
self.setCentralWidget(t)
app = QtGui.QApplication(sys.argv)
m = MainApp()
m.show()
sys.exit(app.exec_())
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QThread
import time
class globalThreads(QtCore.QObject):
def __init__(self,parent=None):
super(globalThreads, self).__init__(parent)
self.threads=[]
def add(self,t):
self.threads.append(t)
for tr in self.threads:
print tr
self.connect(t, QtCore.SIGNAL("finished()"),self.clean_up)
def clean_up(self):
self.threads.remove(self.sender())
for tr in self.threads:
print tr
thread_global=globalThreads()
class SimpleLongRunningThread(QThread):
def __init__(self,parent=None):
super(SimpleLongRunningThread,self).__init__(parent)
thread_global.add(self)
def run(self):
time.sleep(5)
print 'end esecution'
self.emit(QtCore.SIGNAL('end_esecution'))
class TestWidget(QtGui.QWidget):
def __init__(self,back_widget, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.bw=back_widget
self.test_button = QtGui.QPushButton('Click me', self)
self.test_button.setGeometry(10, 10, 200, 35)
self.test_button1 = QtGui.QPushButton('Change widget', self)
self.test_button1.setGeometry(10, 60, 200, 35)
#self.longThread=SimpleLongRunningThread()
#self.connect(self.longThread, QtCore.SIGNAL("finished()"),
# self.longThread, QtCore.SLOT("deleteLater()"))
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.onClick)
self.connect(self.test_button1, QtCore.SIGNAL('clicked()'),self.onClick1)
def onEndEsecution(self):
print 'signal on end esecution'
def onClick(self):
print 'click'
longThread=SimpleLongRunningThread()
self.connect(longThread, QtCore.SIGNAL('end_esecution'),self.onEndEsecution)
#thread_global.add(longThread)
longThread.start()
def onClick1(self):
print 'change widget from TestWidget'
self.parent().setCentralWidget(self.bw())
class AnotherWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.test_button = QtGui.QPushButton('back', self)
self.test_button.setGeometry(10, 10, 200, 35)
self.connect(self.test_button, QtCore.SIGNAL('clicked()'),self.onClick)
def onClick(self):
print 'change widget from AnotherWidget'
w=TestWidget(AnotherWidget)
self.parent().setCentralWidget(w)
class MainApp(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('QThread demo')
t=TestWidget(AnotherWidget)
self.setCentralWidget(t)
app = QtGui.QApplication(sys.argv)
m = MainApp()
m.show()
sys.exit(app.exec_())
_______________________________________________
PySide mailing list
[email protected]
http://lists.openbossa.org/listinfo/pyside