Hi,
I'm not saying this is the problem but this code looks a bit weird.
EDIT: It looks to me that you're passing the address of QVector<GLfloat> and not the actual address of the GLfloats. Convert this to a standard C array GLfloat data[9] = { immediates }; and see what happens. I assume VBO is a QOpenGLBuffer and there's no special overload for QVector<GLfloat>. It just takes a void *.
VBO.allocate(&vertices, vertices.count() * sizeof(vertices));
Looks like you're uploading X vertices but the sizeof is sizeof(QVector<GLfloat>). That's unlikely to be what you mean and could assplode on some paranoid machines (likely you'd walk off the end of the vertex array of sizeof(QVector<GLfloat>) is > sizeof(GLfloat)).
I'd take the advice of @johngod on the stride (although, IIRC that setting is OK. It's the size of each attribute element not the gap between them).
Also, if you have one, try this on another device/machine. You'd be amazed how many times my GL code works differently across desktop and Android platforms. Not even consistent between Android machines.
@johngod One doesn't have to use matrices! I don't use matrices in GL all the time!