[PyQt] upgrade pyqt 4.4.4 to 4.5.4 problems

Linos info at linos.es
Mon Aug 10 13:14:16 BST 2009


Hello,
	i have upgraded my linux development machine from pyqt 4.4.4 to 4.5.4 (and sip 
4.7.9 to 4.8.2) and i am getting any errors with my application. My Qt version 
it is 4.5.2 but errors are related to pyqt version because if i downgrade pyqt 
all works, well obviously can be problems with my code (i think so), but i mean 
that with pyqt 4.4.4 the code works.

1) i am using a QThread to populate large sql queries data to a model in 
background. Inside the class run method i create a worker object (worker it is a 
QObject subclass) and run an event loop to connect the worker and the thread 
with signals and slots, it have been running fine with all pyqt 4.4 versions but 
i now get this error:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QueryModelThread(0xa00db20), parent's thread is QThread(0x9f0a748), 
current thread is QueryModelThread(0xa00db20)

code:
class QueryModelThread(QThread):
     def __init__(self, parent=None):
         super(QueryModelThread, self).__init__(parent)
         self.worker = None

     def executeModel(self, texto_query):
         self.emit(SIGNAL("executeModel"), texto_query)

     def executeQuery(self, texto_query):
         self.emit(SIGNAL("executeQuery"), texto_query)

     def stopIfRunning(self):
         if self.worker:
             self.worker.stopIfRunning()

     def run(self):
         worker = Worker()

         self.connect(self, SIGNAL("executeModel"), worker.slotExecuteModel)
         self.connect(worker, SIGNAL("finalizado"), self, SIGNAL("finalizado"))
         self.connect(worker, SIGNAL("redimensiona"), self, SIGNAL("redimensiona"))
         self.connect(worker, SIGNAL("comenzado"), self, SIGNAL("comenzado"))
         self.connect(worker, SIGNAL("nuevas_filas"), self, SIGNAL("nuevas_filas"))

         self.connect(self, SIGNAL("executeQuery"), worker.slotExecuteQuery)
         self.connect(worker, SIGNAL("query_preparada"), self, 
SIGNAL("query_preparada"))

         self.worker = worker
         self.exec_()

init of the worker class:

class Worker(QObject):
     def __init__(self, parent=None):
         super(Worker, self).__init__(parent)
         self.db = database.conectarDbTienda("QueryModelThread")
         self.query = QSqlQuery(self.db)
         self.stop = self.corriendo = False


2) i have many models that use a set of shared methods (apart from Qt's models 
methods) so i created a python class 
(editor_documentos_base.EditorDocumentosBaseModel) with all this methods and in 
my models i use this multiple inheritance.

class AlbaranEntradaModel(QAbstractTableModel, 
editor_documentos_base.EditorDocumentosBaseModel):
     def __init__(self, parent):
         super(AlbaranProveedorModel, self).__init__()
         editor_documentos_base.EditorDocumentosBaseModel.__init__(self)

rowCount and columnCount are implemented in this base class and now when i call 
tableView.setModel(sampleModel) (where sampleModel it is the instance of one of 
my models) i get this errors:
NotImplementedError: QAbstractTableModel.rowCount() is abstract and must be 
overridden
NotImplementedError: QAbstractTableModel.columnCount() is abstract and must be 
overridden


3) i know that signals and slots have changed with this versions but i thought 
the old syntax it is still support for compatibility, i get this error emitting 
this signal, do i am wrong or this is other problem?

self.emit(SIGNAL("cambiaFoto(QVariant, QVariant)"), QVariant(), QVariant())
TypeError: argument 0 of signal PyQtProxy.ambiaFoto(QVariant,QVariant) has an 
invalid type


I have never detected a bug in PyQT, i think it is a great piece of software 
(sip too!) so i suppose all of this is my fault but i need a bit of help to 
understand where it is the problem, thanks in advance.

Regards,
Miguel Angel.





More information about the PyQt mailing list