Trolltech Home | Qt-interest Home | Recent Threads | All Threads | Author | Date
All threads index page 4

Qt-interest Archive, January 2008
processEvents on QlistWidget operations does nothing


Message 1 in thread

Hello,
I am sending you this message, originally sent to the PyQt mailing list, as it seems, according to Phil's answer that the problem lies within Qt.
As suggested by Phil, I changed the program to make the urllib call from within a different thread, but, if it partially solves the problem, it repaces one line of code by 
more than fifty, makes the code almost unreadable, and disconnect the QListWidget from the QProgressBar updates. (the new code is at your disposal).
My point I that I just want that QListWidget works as expected , i.e. that when I say "addItem(...)", I see the item in the UI, now, not later , who knows when.
Regards
Pierre

On Thursday 24 January 2008, P. Mathé wrote:
> The program listed below downloads the broadcast schedule of a radio
> station for the cureent day and the three following. For each date , it
> reads an url, updates the progressBar and prints out in a QListWidget the
> date corresponding to the url just downloaded.
>
> When I run this program, the progressBar is updated as soon as each page is
> received, but the rows added into the QListWidget are displayed, all at the
> same time, only when all the pages are received, i.e. when the loop "for
> jour in jours" ends.
>
> (in the program listed below the lines commented out "self.log.update()" and/or "self.log.repaint()" change
> nothing if uncommented).
>
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
>
> from PyQt4.QtCore import *
> from PyQt4.QtGui import *
>
> from mx.DateTime import *
> import urllib
>
> class radioUi(object):
>     def setupUi(self, radioUi):
>         radioUi.setObjectName("radioUi")
>        
> radioUi.resize(QSize(QRect(0,0,268,352).size()).expandedTo(radioUi.minimumS
>izeHint()))
>
>         self.log = QListWidget(radioUi)
>         self.log.setGeometry(QRect(10,80,248,261))
>         self.log.setObjectName("log")
>
>         self.btnGo = QPushButton(radioUi)
>         self.btnGo.setGeometry(QRect(160,20,80,26))
>         self.btnGo.setObjectName("pushButton")
>         self.btnGo.setText(u"start")
>
>         self.progressBar = QProgressBar(radioUi)
>         self.progressBar.setGeometry(QRect(10,50,241,23))
>         self.progressBar.setProperty("value",QVariant(24))
>
> class radioProgDialog(QDialog, radioUi):
>     def __init__(self):
>         QDialog.__init__(self)
>         # Set up the user interface
>         self.setupUi(self)
>         self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
>         #
>
>     def extraire(self):
>         url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
>         #
>         jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0, 4)]
>         self.progressBar.setMaximum(len(jours))
>         self.progressBar.setValue(0)
>         print 'maxi', self.progressBar.maximum()
>         for jour in jours:
>                 print self.log.updatesEnabled()
>                 next_url=url % jour
>                 p=urllib.urlopen(next_url).read()
>                 #self.pagesEmissions.append(p)
>                 d=DateFromTicks(jour)
>                 logText=u'téléchargement %02d/%02d/%d' %
> (d.day,d.month,d.year) self.log.addItem(logText)
>                 self.progressBar.setValue(self.progressBar.value() + 1)
>                 print 'value', self.progressBar.value()
>                 #self.log.update()
>                 #self.log.repaint()
>                 QCoreApplication.processEvents(QEventLoop.AllEvents)
>                 print logText
>         print 'fini Vivace'
>
> if __name__ == "__main__":
>     import sys
>     app = QApplication(sys.argv)
>     radioProg = radioProgDialog()
>     radioProg.show()
>     sys.exit(app.exec_())
>
> Version Numbers Used
> Python 2.5.1
> Qt 4.3.2
> PyQt 4.3.1
> sip 4.7
> QScintilla 2.1
> Eric4 4.0.3 (r1529)

I think this is related to the comment in the docs for processEvents() about 
some widgets not working properly in this circumstance.

A better design would be to put the read in a separate thread and update the 
GUI by sending a custom event.

Phil

--
 [ signature omitted ] 

Message 2 in thread

You may find the following to work really well.. Of course I'm not a Python guy.. but here is how you could do it in C++...

Rather then having a loop that goes over the jours, have a slot that adds 1 time.  And add to the class, the iterator...

After all the jours are loaded, you call the following

QTimer::singleShot( 0, this, SLOT( onHandleNextJour() ) )

0 means that the first time the event loop gets activated, the timer timesout, which is connected to the slot.

In the slot onHandleNextJour you add the result to the tree, update the progress bar value, and then if your not at the end, call the singleShot method again.


What this does, is allows the event queue (including paintEvents) to occur without any hacks... 

processEvents is a HACK... if used properly and safely it can be very effective... However, I have yet to find a processEvents I couldn't reorganize to use the singlShot with 0 time timeout..

And of course the good news... it shouldn't add any code... just reorg a bit...

While Andreas is correct, using a QThread is also a 100% valid solution... It is overkill for "simple" tasks... And frankly, what, you I or Andreas considers simple for the overkill will vary on each and every project... I already have a class I re-use quite a bit that is templatized to allow for a "loop and execute" type thread model... But I don't use it 100% of the time, because of the intrinsic complexities of threading.

Scott
> -----Original Message-----
> From: P. Mathé [mailto:pmathe@xxxxxxx]
> Sent: Sunday, January 27, 2008 1:35 PM
> To: qt-interest@xxxxxxxxxxxxx
> Subject: processEvents on QlistWidget operations does nothing
> 
> Hello,
> I am sending you this message, originally sent to the PyQt mailing list,
> as it seems, according to Phil's answer that the problem lies within Qt.
> As suggested by Phil, I changed the program to make the urllib call from
> within a different thread, but, if it partially solves the problem, it
> repaces one line of code by
> more than fifty, makes the code almost unreadable, and disconnect the
> QListWidget from the QProgressBar updates. (the new code is at your
> disposal).
> My point I that I just want that QListWidget works as expected , i.e. that
> when I say "addItem(...)", I see the item in the UI, now, not later , who
> knows when.
> Regards
> Pierre
> 
> On Thursday 24 January 2008, P. Mathé wrote:
> > The program listed below downloads the broadcast schedule of a radio
> > station for the cureent day and the three following. For each date , it
> > reads an url, updates the progressBar and prints out in a QListWidget
> the
> > date corresponding to the url just downloaded.
> >
> > When I run this program, the progressBar is updated as soon as each page
> is
> > received, but the rows added into the QListWidget are displayed, all at
> the
> > same time, only when all the pages are received, i.e. when the loop "for
> > jour in jours" ends.
> >
> > (in the program listed below the lines commented out "self.log.update()"
> and/or "self.log.repaint()" change
> > nothing if uncommented).
> >
> > #!/usr/bin/env python
> > # -*- coding: utf-8 -*-
> >
> > from PyQt4.QtCore import *
> > from PyQt4.QtGui import *
> >
> > from mx.DateTime import *
> > import urllib
> >
> > class radioUi(object):
> >     def setupUi(self, radioUi):
> >         radioUi.setObjectName("radioUi")
> >
> >
> radioUi.resize(QSize(QRect(0,0,268,352).size()).expandedTo(radioUi.minimum
> S
> >izeHint()))
> >
> >         self.log = QListWidget(radioUi)
> >         self.log.setGeometry(QRect(10,80,248,261))
> >         self.log.setObjectName("log")
> >
> >         self.btnGo = QPushButton(radioUi)
> >         self.btnGo.setGeometry(QRect(160,20,80,26))
> >         self.btnGo.setObjectName("pushButton")
> >         self.btnGo.setText(u"start")
> >
> >         self.progressBar = QProgressBar(radioUi)
> >         self.progressBar.setGeometry(QRect(10,50,241,23))
> >         self.progressBar.setProperty("value",QVariant(24))
> >
> > class radioProgDialog(QDialog, radioUi):
> >     def __init__(self):
> >         QDialog.__init__(self)
> >         # Set up the user interface
> >         self.setupUi(self)
> >         self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
> >         #
> >
> >     def extraire(self):
> >
> url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
> >         #
> >         jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0,
> 4)]
> >         self.progressBar.setMaximum(len(jours))
> >         self.progressBar.setValue(0)
> >         print 'maxi', self.progressBar.maximum()
> >         for jour in jours:
> >                 print self.log.updatesEnabled()
> >                 next_url=url % jour
> >                 p=urllib.urlopen(next_url).read()
> >                 #self.pagesEmissions.append(p)
> >                 d=DateFromTicks(jour)
> >                 logText=u'téléchargement %02d/%02d/%d' %
> > (d.day,d.month,d.year) self.log.addItem(logText)
> >                 self.progressBar.setValue(self.progressBar.value() + 1)
> >                 print 'value', self.progressBar.value()
> >                 #self.log.update()
> >                 #self.log.repaint()
> >                 QCoreApplication.processEvents(QEventLoop.AllEvents)
> >                 print logText
> >         print 'fini Vivace'
> >
> > if __name__ == "__main__":
> >     import sys
> >     app = QApplication(sys.argv)
> >     radioProg = radioProgDialog()
> >     radioProg.show()
> >     sys.exit(app.exec_())
> >
> > Version Numbers Used
> > Python 2.5.1
> > Qt 4.3.2
> > PyQt 4.3.1
> > sip 4.7
> > QScintilla 2.1
> > Eric4 4.0.3 (r1529)
> 
> I think this is related to the comment in the docs for processEvents()
> about
> some widgets not working properly in this circumstance.
> 
> A better design would be to put the read in a separate thread and update
> the
> GUI by sending a custom event.
> 
> Phil
> 
> --
> To unsubscribe - send a mail to qt-interest-request@xxxxxxxxxxxxx with
> "unsubscribe" in the subject or the body.
> List archive and information: http://lists.trolltech.com/qt-interest/

--
 [ signature omitted ] 

Message 3 in thread

On 27.01.08 13:33:25, Scott Aron Bloom wrote:
> After all the jours are loaded, you call the following
> 
> QTimer::singleShot( 0, this, SLOT( onHandleNextJour() ) )
> 
> 0 means that the first time the event loop gets activated, the timer timesout, which is connected to the slot.
> 
> In the slot onHandleNextJour you add the result to the tree, update the progress bar value, and then if your not at the end, call the singleShot method again.

Thanks Scott, I completely forgot about that way. Thats probably a lot
better than the threaded solutions, for people not experienced with
threads, those can be a real headache to debug...

Andreas

-- 
 [ signature omitted ] 

Message 4 in thread

> > In the slot onHandleNextJour you add the result to the tree, update
the
> progress bar value, and then if your not at the end, call the
singleShot
> method again.
> 
> Thanks Scott, I completely forgot about that way. Thats probably a lot
> better than the threaded solutions, for people not experienced with
> threads, those can be a real headache to debug...
> 
> Andreas
> 

NP... I didn't see the p=urllib.urlopen(next_url).read() line in the
code...  I just missed it...

Of course with that line in there... I might just do it another way :)

Process 1 url by having slots connected to it for the progress parts
allowing the gui to update on each byte of download (or however many
bytes you set...) and use the non-blocking calls to QHttp..

But the method I proposed I find to be very "easy" to implement... and
for the non-thread developer... very easy to debug... thread debugging
can cause lots of money to be spent on consultants like myself :)

Scott

--
 [ signature omitted ] 

Message 5 in thread

Thank you Scott for your answer, but unnless I didn'y understand you correctly, it does not work : the timer singleshot is fired only after the loop ends.
Here is the modified radioProgDialog class of the program wherre I have added th updateGui method and added the QTimer.singleShot(0, self.updateGui) statement :

class radioProgDialog(QDialog, radioUi):
    def __init__(self):
        QDialog.__init__(self)
        # Set up the user interface 
        self.setupUi(self)
        self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
        #

    def updateGui(self):
        d=self.d
        logText=u'téléchargement %02d/%02d/%d' % (d.day,d.month,d.year)
        self.log.insertItem(0, QListWidgetItem(logText))
        self.progressBar.setValue(self.progressBar.value() + 1) 
        print logText
        
        
    def extraire(self):
        url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
        # 
        jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0, 4)]
        self.progressBar.setMaximum(len(jours))
        self.progressBar.setValue(0)
        print 'maxi', self.progressBar.maximum()
        for jour in jours:
            next_url=url % jour
            #p=urllib.urlopen(next_url).read()
            time.sleep(2)
            #self.pagesEmissions.append(p)
            self.d=DateFromTicks(jour)
            QTimer.singleShot(0, self.updateGui)
        print 'fini Vivace'

Le dimanche 27 janvier 2008, Scott Aron Bloom a écrit :
> 
> You may find the following to work really well.. Of course I'm not a Python guy.. but here is how you could do it in C++...
> 
> Rather then having a loop that goes over the jours, have a slot that adds 1 time.  And add to the class, the iterator...
> 
> After all the jours are loaded, you call the following
> 
> QTimer::singleShot( 0, this, SLOT( onHandleNextJour() ) )
> 
> 0 means that the first time the event loop gets activated, the timer timesout, which is connected to the slot.
> 
> In the slot onHandleNextJour you add the result to the tree, update the progress bar value, and then if your not at the end, call the singleShot method again.
> 
> 
> What this does, is allows the event queue (including paintEvents) to occur without any hacks... 
> 
> processEvents is a HACK... if used properly and safely it can be very effective... However, I have yet to find a processEvents I couldn't reorganize to use the singlShot with 0 time timeout..
> 
> And of course the good news... it shouldn't add any code... just reorg a bit...
> 
> While Andreas is correct, using a QThread is also a 100% valid solution... It is overkill for "simple" tasks... And frankly, what, you I or Andreas considers simple for the overkill will vary on each and every project... I already have a class I re-use quite a bit that is templatized to allow for a "loop and execute" type thread model... But I don't use it 100% of the time, because of the intrinsic complexities of threading.
> 
> Scott

--
 [ signature omitted ] 

Message 6 in thread

On 28.01.08 09:58:20, P. Mathé wrote:
> Thank you Scott for your answer, but unnless I didn'y understand you correctly, it does not work : the timer singleshot is fired only after the loop ends.

Unfortunately you didn't understand correctly. What Scott meant was
that the slot connected to the singleshot should download the stuff with
urllib, then update the listwidget and then return control to the event
loop (and if jours is not empty schedule another singleshot timer).

Something like this should work:

class radioProgDialog(QDialog, radioUi):
    def __init__(self):
        QDialog.__init__(self)
        # Set up the user interface 
        self.setupUi(self)
        self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
        #

    def updateGui(self):
        d=self.d
        jour = self.jours.last()
        self.jours.removeAll( jour )
        next_url=url % jour
        p=urllib.urlopen(next_url).read()
        self.d=DateFromTicks(jour)
        logText=u'téléchargement %02d/%02d/%d' % (d.day,d.month,d.year)
        self.log.insertItem(0, QListWidgetItem(logText))
        self.progressBar.setValue(self.progressBar.value() + 1) 
        print logText
        if( self.jours.isEmpty() ):
           QTimer.singleShot(0, self.updateGui)
            
        
        
    def extraire(self):
        self.url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
        # 
        self.jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0, 4)]
        self.progressBar.setMaximum(len(jours))
        self.progressBar.setValue(0)
        print 'maxi', self.progressBar.maximum()
        QTimer.singleShot(0, self.updateGui)
        print 'fini Vivace'

Andreas

-- 
 [ signature omitted ] 

Message 7 in thread

It will work.... You're not understanding me :)

The problem is, your loop is in one function... You need to re-read what I said...

Here is some pseudo code to help along the way..  

Proc initJours()
{
Jours = ...... // set up your jours array as normal
currentJour = 0; // an iterator that is a member variable of the class
QTimer::singleShot( 0, this, SLOT( handleNextJour ) )
}

proc handleNextJour()
{
	next_url=url % jour
	p=urllib.urlopen(next_url).read()
	self.progressBar.setValue( currentjour )
	currentJour++;
	if ( currentJour < jours.count() )	
		QTimer::singleShot( 0, this, SLOT( handleNextJour ) )
}



> -----Original Message-----
> From: P. Mathé [mailto:pmathe@xxxxxxx]
> Sent: Monday, January 28, 2008 3:58 AM
> To: qt-interest@xxxxxxxxxxxxx
> Cc: pyqt@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: processEvents on QlistWidget operations does nothing
> 
> Thank you Scott for your answer, but unnless I didn'y understand you
> correctly, it does not work : the timer singleshot is fired only after the
> loop ends.
> Here is the modified radioProgDialog class of the program wherre I have
> added th updateGui method and added the QTimer.singleShot(0,
> self.updateGui) statement :
> 
> class radioProgDialog(QDialog, radioUi):
>     def __init__(self):
>         QDialog.__init__(self)
>         # Set up the user interface
>         self.setupUi(self)
>         self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
>         #
> 
>     def updateGui(self):
>         d=self.d
>         logText=u'téléchargement %02d/%02d/%d' % (d.day,d.month,d.year)
>         self.log.insertItem(0, QListWidgetItem(logText))
>         self.progressBar.setValue(self.progressBar.value() + 1)
>         print logText
> 
> 
>     def extraire(self):
> 
> url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
>         #
>         jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0, 4)]
>         self.progressBar.setMaximum(len(jours))
>         self.progressBar.setValue(0)
>         print 'maxi', self.progressBar.maximum()
>         for jour in jours:
>             next_url=url % jour
>             #p=urllib.urlopen(next_url).read()
>             time.sleep(2)
>             #self.pagesEmissions.append(p)
>             self.d=DateFromTicks(jour)
>             QTimer.singleShot(0, self.updateGui)
>         print 'fini Vivace'
> 
> Le dimanche 27 janvier 2008, Scott Aron Bloom a écrit :
> >
> > You may find the following to work really well.. Of course I'm not a
> Python guy.. but here is how you could do it in C++...
> >
> > Rather then having a loop that goes over the jours, have a slot that
> adds 1 time.  And add to the class, the iterator...
> >
> > After all the jours are loaded, you call the following
> >
> > QTimer::singleShot( 0, this, SLOT( onHandleNextJour() ) )
> >
> > 0 means that the first time the event loop gets activated, the timer
> timesout, which is connected to the slot.
> >
> > In the slot onHandleNextJour you add the result to the tree, update the
> progress bar value, and then if your not at the end, call the singleShot
> method again.
> >
> >
> > What this does, is allows the event queue (including paintEvents) to
> occur without any hacks...
> >
> > processEvents is a HACK... if used properly and safely it can be very
> effective... However, I have yet to find a processEvents I couldn't
> reorganize to use the singlShot with 0 time timeout..
> >
> > And of course the good news... it shouldn't add any code... just reorg a
> bit...
> >
> > While Andreas is correct, using a QThread is also a 100% valid
> solution... It is overkill for "simple" tasks... And frankly, what, you I
> or Andreas considers simple for the overkill will vary on each and every
> project... I already have a class I re-use quite a bit that is templatized
> to allow for a "loop and execute" type thread model... But I don't use it
> 100% of the time, because of the intrinsic complexities of threading.
> >
> > Scott
> 
> --
> To unsubscribe - send a mail to qt-interest-request@xxxxxxxxxxxxx with
> "unsubscribe" in the subject or the body.
> List archive and information: http://lists.trolltech.com/qt-interest/

--
 [ signature omitted ] 

Message 8 in thread

It does, thank you
Pierre

Le lundi 28 janvier 2008, Scott Aron Bloom a écrit :
> It will work.... You're not understanding me :)
> 
> The problem is, your loop is in one function... You need to re-read what I said...
> 
> Here is some pseudo code to help along the way..  
> 
> Proc initJours()
> {
> Jours = ...... // set up your jours array as normal
> currentJour = 0; // an iterator that is a member variable of the class
> QTimer::singleShot( 0, this, SLOT( handleNextJour ) )
> }
> 
> proc handleNextJour()
> {
> 	next_url=url % jour
> 	p=urllib.urlopen(next_url).read()
> 	self.progressBar.setValue( currentjour )
> 	currentJour++;
> 	if ( currentJour < jours.count() )	
> 		QTimer::singleShot( 0, this, SLOT( handleNextJour ) )
> }
> 
> 
> 
> > -----Original Message-----
> > From: P. Mathé [mailto:pmathe@xxxxxxx]
> > Sent: Monday, January 28, 2008 3:58 AM
> > To: qt-interest@xxxxxxxxxxxxx
> > Cc: pyqt@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: Re: processEvents on QlistWidget operations does nothing
> > 
> > Thank you Scott for your answer, but unnless I didn'y understand you
> > correctly, it does not work : the timer singleshot is fired only after the
> > loop ends.
> > Here is the modified radioProgDialog class of the program wherre I have
> > added th updateGui method and added the QTimer.singleShot(0,
> > self.updateGui) statement :
> > 
> > class radioProgDialog(QDialog, radioUi):
> >     def __init__(self):
> >         QDialog.__init__(self)
> >         # Set up the user interface
> >         self.setupUi(self)
> >         self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
> >         #
> > 
> >     def updateGui(self):
> >         d=self.d
> >         logText=u'téléchargement %02d/%02d/%d' % (d.day,d.month,d.year)
> >         self.log.insertItem(0, QListWidgetItem(logText))
> >         self.progressBar.setValue(self.progressBar.value() + 1)
> >         print logText
> > 
> > 
> >     def extraire(self):
> > 
> > url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
> >         #
> >         jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0, 4)]
> >         self.progressBar.setMaximum(len(jours))
> >         self.progressBar.setValue(0)
> >         print 'maxi', self.progressBar.maximum()
> >         for jour in jours:
> >             next_url=url % jour
> >             #p=urllib.urlopen(next_url).read()
> >             time.sleep(2)
> >             #self.pagesEmissions.append(p)
> >             self.d=DateFromTicks(jour)
> >             QTimer.singleShot(0, self.updateGui)
> >         print 'fini Vivace'
> > 
> > Le dimanche 27 janvier 2008, Scott Aron Bloom a écrit :
> > >
> > > You may find the following to work really well.. Of course I'm not a
> > Python guy.. but here is how you could do it in C++...
> > >
> > > Rather then having a loop that goes over the jours, have a slot that
> > adds 1 time.  And add to the class, the iterator...
> > >
> > > After all the jours are loaded, you call the following
> > >
> > > QTimer::singleShot( 0, this, SLOT( onHandleNextJour() ) )
> > >
> > > 0 means that the first time the event loop gets activated, the timer
> > timesout, which is connected to the slot.
> > >
> > > In the slot onHandleNextJour you add the result to the tree, update the
> > progress bar value, and then if your not at the end, call the singleShot
> > method again.
> > >
> > >
> > > What this does, is allows the event queue (including paintEvents) to
> > occur without any hacks...
> > >
> > > processEvents is a HACK... if used properly and safely it can be very
> > effective... However, I have yet to find a processEvents I couldn't
> > reorganize to use the singlShot with 0 time timeout..
> > >
> > > And of course the good news... it shouldn't add any code... just reorg a
> > bit...
> > >
> > > While Andreas is correct, using a QThread is also a 100% valid
> > solution... It is overkill for "simple" tasks... And frankly, what, you I
> > or Andreas considers simple for the overkill will vary on each and every
> > project... I already have a class I re-use quite a bit that is templatized
> > to allow for a "loop and execute" type thread model... But I don't use it
> > 100% of the time, because of the intrinsic complexities of threading.
> > >
> > > Scott
> > 
> > --
> > To unsubscribe - send a mail to qt-interest-request@xxxxxxxxxxxxx with
> > "unsubscribe" in the subject or the body.
> > List archive and information: http://lists.trolltech.com/qt-interest/
> 
> --
> To unsubscribe - send a mail to qt-interest-request@xxxxxxxxxxxxx with "unsubscribe" in the subject or the body.
> List archive and information: http://lists.trolltech.com/qt-interest/
> 
> 


--
 [ signature omitted ]