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

Reply via email to