[PyQt] QDialog's widgets do not show up correctly

Christoph Schmidt ch_schmidt at online.de
Sun Jul 6 16:19:30 BST 2008


Hi,

I'm currently learning programming with PyQt and play around a bit with 
python-apt + PyQt4. My problem is as follows: In order to indicate the 
progress of an apt operation, python-apt offers the possibility to pass an 
instance of a progress class. In this case I subclassed FetchProgress from 
apt.progress:

class GuiUpdateProgress(QDialog, FetchProgress):
    def __init__(self, parent=None):
	QDialog.__init__(self, parent)
	FetchProgress.__init__(self)
	self.items = {}
	self.setModal(True)
	self.fetchIndicator = QProgressBar()
	self.speedIndicator = QLabel("Unknown")
	self.layout = QVBoxLayout()
	self.layout.addWidget(self.fetchIndicator)
	self.layout.addWidget(self.speedIndicator)
	self.setLayout(self.layout)
    
    def start(self):
	self.show()
    
    def stop(self):
        if 2 in self.items.values():
	    QMessageBox.warning(self, "Update Error",
                                  "One or more sources could not be updated!")
	self.hide()
    
    def updateStatus(self, uri, descr, shortDescr, status):
	self.items[uri] = status   # unimportant

    def pulse(self):
	self.percent = ((self.currentBytes + self.currentItems)*100.0) /
                                 float(self.totalBytes + self.totalItems)
        if self.currentCPS > 0:
            self.eta = (self.totalBytes-self.currentBytes) /
                             float(self.currentCPS)
	self.fetchIndicator.setValue(int(self.percent))
	self.speedIndicator.setText(str(self.eta))
	return True
    
    def mediaChange(self, medium, drive):
	pass   # unimportant

When I now pass an instance of this class to a python-apt operation, at first 
start() is called, then updateStatus() and pulse() are being called 	
repeatedly until the operation is done and stop() is called in the end.

I would expect this code to let a QDialog pop up, show its initial state when 
start() is called and update whenever pulse() is called. However, it seems to 
only show an empty window before pulse() is called the first time, and even 
when pulse() is called, only the QProgressBar updates itself, the QLabel 
stays invisible.

I uploaded the a tstable version of the code at http://pastebin.com/f3caddde3 
to show you what I mean (python-apt is required). My PyQt Version is 
(according to Synaptic) 4.3.3.

I hope somebody can tell me what I am doing wrong.

Thanks in advance.


More information about the PyQt mailing list