The visitors came close to securing an early lead when Christopher Samba got his head to a corner and forced an impressive stop out of Villa keeper Brad Guzan.
Guzan denied Samba again two minutes later, beating clear his bending, 12-yard strike to keep the scoreline at 0-0.
However, it did not remain that way for long. Villa lost possession inside their own half and QPR punished them dearly through Jermaine Jenas, who bundled the ball past Guzan after he had spilled Bobby Zamora's initial effort.
Villa dominated the second half, but they let their lead slip in the 73rd minute. Spurs loanee Andros Townsend drew QPR level with a neat finish following some impressive play by Loic Remy.
It was a closely-contested relegation battle, but Villa had the final say. Weimann went on a mazy run and laid one on a plate for Benteke, who guided the ball into an empty net in the 80th minute to seal maximum points for the hosts.