Mitchell,
Your problem is that you are computing the slope at point {-2,3} as Q2 -- this is correct, however, when you plot Q2 you plot it as a point. It is a direction -- your plot must add P2 plus some multiple of Q2. The multiple determines the vector length. For example, use P2+Normalize[Q2].
Using your example:
Show[ContourPlot[f[x, y], {x, -5, 10}, {y, -5, 10}],
Graphics[{{PointSize[Large], Black,
Point[{P2, P2 + Normalize[Q2]}]}}],
Graphics[Arrow[{P2, P2 + Normalize[Q2]}]],
VectorPlot[Evaluate[Grad[f[x, y], {x, y}]], {x, -5, 10}, {y, -5, 10},
VectorPoints -> 8, AxesLabel -> Automatic]]