pyqt4 signal/slot using PyObject* and shortcut

Phil Thompson phil at riverbankcomputing.co.uk
Fri Apr 27 03:10:33 EDT 2007


On Friday 27 April 2007 7:05 am, Pradnyesh Sawant wrote:
> On 4/27/07, Pradnyesh Sawant wrote:
> > Hello, i have the following code:
> > #################################################################
> > import time
> > import sys
> > from PyQt4 import QtGui, QtCore
> >
> > class Counter(QtCore.QThread):
> >     def __init__(self):
> >         QtCore.QThread.__init__(self)
> >     def run(self):
> >         cntr = 0
> >         while cntr < 10:
> >             cntr += 1
> >             self.emit(QtCore.SIGNAL("showCntr1(PyObject*)"), (cntr,
> > "a"))   # line 1
> >             self.emit(QtCore.SIGNAL("showCntr2"), (cntr, "a"))
> >           # line 2
> >             time.sleep(0.2)
> > class Gui(QtGui.QDialog):
> >     def __init__(self, parent = None):
> >         QtGui.QDialog.__init__(self, parent)
> >         frameStyle = QtGui.QFrame.Sunken | QtGui.QFrame.Panel
> >
> >         self.lCntr = QtGui.QLabel()
> >         self.lCntr.setFrameStyle(frameStyle)
> >         loGrd = QtGui.QGridLayout()
> >         loGrd.addWidget(self.lCntr, 0, 0)
> >         self.setLayout(loGrd)
> >         self.setWindowTitle(self.tr("Counter"))
> >     def showCntr1(self, val):
> >         print val, str(val)
> >         self.lCntr.setText(str(val))
> >     def showCntr2(self, val):
> >         print val, str(val)
> >         self.lCntr.setText(str(val))
> > if __name__ == "__main__":
> >     app = QtGui.QApplication(sys.argv)
> >     dialog = Gui()
> >     cntr = Counter()
> >     cntr.start()
> >     QtCore.QObject.connect(cntr, QtCore.SIGNAL("showCntr1(PyObject*)"),
> >             dialog.showCntr1, QtCore.Qt.QueuedConnection)
> >     QtCore.QObject.connect(cntr, QtCore.SIGNAL("showCntr2"),
> >             dialog.showCntr1, QtCore.Qt.QueuedConnection)
>
> There's a small bug in the above line, it should be dialog.showCntr2,
> and not dialog.showCntr1. However, even with this change, the output
> shown below remains the same :(
>
> >     sys.exit(dialog.exec_())
> > #################################################################
> > If i comment out "line 1", then i get the following output:
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > 0.2 0.2
> > Notice that 0.2 is the time value of the sleep instruction. Why is
> > this happening?
> >
> > On the other hand, if i comment out "line 2", then i get the following
> > output: (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > (<refcnt 0 at 0xb7dcd28c>, 'a') (<NULL>, <NULL>)
> > What i get from the above is that a reference to "cntr" is being
> > passed, but by the time the gui thread is actually run, both the
> > values (cntr and "a") have been destroyed, hence the NULL values.
> > ***How do i circumvent this problem?***
> >
> > Lastly, if i don't comment out any of line 1 or 2, then i get the foll
> > output: (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui object at
> > 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui
> > object at 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>,
> > (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui object at
> > 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui
> > object at 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>,
> > (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui object at
> > 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui
> > object at 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>,
> > (<__main__.Gui object at 0xb6a8f12c>, (<__main__.Gui object at
> > 0xb6a8f12c>, (<__main__.Gui object at 0xb6a8f12c>, ..........
> > i don't know what this means??? Can anyone kindly explain what's
> > happening...
> >
> > I'm using:
> > python: 2.4.4~c1-0ubuntu1
> > qt4-dev-tools: not installed
> > python-qt4: 4.0.1-1ubuntu1
> > sip4: (4.4.5-2ubuntu1
> > os: ubuntu edgy

As I said in the other thread, upgrade to a current release of PyQt. 
Also "PyObject*" should no longer be used in signal signatures - 
use "PyQt_PyObject" instead.

Phil



More information about the Python-list mailing list