Driver was the the right way to go, thanks for pointing this out.
It turns out that the driver had a calibration method built in, but the transform matrix was not set to change the coordinates. I calculated the new matrix values based on the max coordinates displayed by evtest and the actual coordinates of the framebuffer, plugged them in to the driver code, compiled and ... it works!. Evtest displays correct coordinates and Qt works correctly with no tslib.
I don't like the fact that calibration matrix is hardcoded into the driver, but I consider fixing this an extracredit activity to be done sometime in the future.