I did in fact have to call glDrawBuffers myself. I assumed this was handled by the FBO binding, but apparently not.
QOpenGLExtraFunctions* f = QOpenGLContext::currentContext()->extraFunctions();
GLenum bufs[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
f->glDrawBuffers(2, bufs);
This seems strange to me that the FBO abstraction supports color attachments, but requires extra functions to use them.