The most Qt-ish (but definitely not the fastest) way to do it is to use an object that will open source and destination file and perform a loop of reading a blob of data, writing it to the destination and emitting a signal reporting the progress. You can implement it around QIODevice::bytesWritten to make it asynchronous. A quicker but more dirty way would be to use fast platform dependent API like sendFile() on Linux (that doesn't copy data to userspace) in a thread and use QFileSystemWatcher to watch progress of the copy operation.