Hi,

I've been trying to get a binary file uploaded to an FTP server using QtNetwork.QFtp on Windows XP.

The area I seem to be having trouble with is getting the dataTransferProgress signal to fire. The method comes in two forms, one which accepts a QByteArray, which seemingly doesn't have the dataTransferProgress signal, and the other which requires a QIODevice which does.

I can manage to connect, authenticate and upload the file if I pass in the QFile.ReadAll() method, but since that returns a QByteArray, I don't get the lovely dataTransferProgress signal, which I want to use to tie to a progress bar.

I looked into just passing the QFile into the put method since it inherits QIODevice but that just causes the program to crash. So I looked into the other children and QBuffer sounds like the right fit-- "The QBuffer class provides a QIODevice for a QByteArray". Since I know the QFile.ReadAll() returns a QByteArray, I thought I may have cracked the problem, but when I try:

buffer = QtCore.QBuffer()
buffer.open(QtCore.QIODevice.ReadWrite)
buffer.setData(f.readAll())  #f is a QFile object.

then pass that buffer object into the QFtp.put(buffer,"outName") the program just crashes.

I'm sure I have a misunderstanding somewhere-- I can't find any Python examples of dataTransferProgress or QFtp.put that show me the correct usage, I've tried Google (and it's code search) and after a stint in the IRC channel, they pointed me here. Attached is a minimal example (or as close to it as I could manage). The commented out line 29 is the working example, but doesn't fire the signal (and I'm assuming because it's providing a QByteArray), line 28 should be handing the put method a QIODevice, and perhaps it is, but it's causing the program to crash ( which I've learnt tends to indicate I'm doing something rather silly).

Any help would be most appreciated.
import sys
from PyQt4 import QtCore, QtGui, QtNetwork
from PyQt4.QtSql import *

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.on_goUpload_clicked()
        
    def on_goUpload_clicked(self):
        self.client = QtNetwork.QFtp()
        self.connect(self.client, 
QtCore.SIGNAL('stateChanged(int)'),self.updateStatus)
        self.connect(self.client, 
QtCore.SIGNAL('dataTransferProgress(int,int)'),self.updateProgress)
        self.client.connectToHost('ftp.thefort.org')
        self.client.login("ting","moomin")
        
    def updateProgress(self, position, total):
        print(str(position) + "::" + str(total))
        
    def updateStatus(self,state):
        print(state)
        if state == 4:
            f= QtCore.QFile("binaryFile")
            f.open(QtCore.QIODevice.ReadOnly)
            buffer = QtCore.QBuffer()
            buffer.open(QtCore.QIODevice.ReadWrite)
            buffer.setData(f.readAll())
            self.client.put(buffer,"outname")  ## Causes a crash
            #self.client.put(f.readAll(),"outname")  ## Uploads, but no 
dataTransferProgress signal.

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MainForm()
    myapp.show()
    sys.exit(app.exec_())
_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to