This code never gets call IMHO, or only once, if _busPos is initialized with something other than zero which is greater than _busSize when it gets initialized:
Qt Code:
  1. if (_bufPos >= _bufSize) {
  2. fillBuffer();
  3. if (_bufSize == 0) return 0;
  4. }
To copy to clipboard, switch view to plain text mode 

Since in here, _bufPos is always set to 0:
Qt Code:
  1. void CompressedFile::fillBuffer()
  2. {
  3. _bufOffset += _bufSize;
  4. _bufSize = gzread(_file, _buffer, BUFSIZE);
  5. _bufPos = 0; //<--- always 0.
  6. }
To copy to clipboard, switch view to plain text mode 

Is there a reason you are reading char after char and not a whole line using QIDevice::readLine()?
Because this is what takes so long...