The win moved QPR to within four points of Villa outside the drop zone - and they go to Villa Park this weekend.
Danny Rose came off the bench in the 57th minute for the Black Cats.
Staying in the Premier League, Simon Dawkins was an unused substitute as Villa won another huge game at Reading.
In the Championship, Harry Kane played 61 minutes as Leicester City suffered a 1-0 home defeat against Sheffield Wednesday while Jon Obika came off the bench late as Charlton beat Huddersfield 1-0 at the John Smith's Stadium.
We were denied the spectacle of a Spurs showdown for a place at Wembley as Adam Smith was an unused substitute in Millwall's goalless draw against Blackburn in the FA Cup quarter-final at the New Den. However, David Bentley played a full shift for Rovers and provided the cross for Josh King to strike the woodwork five minutes from time.
The teams replay at Ewood Park on Wednesday for a semi-final against Wigan at Wembley.
In League Two, Jordan Archer's Wycombe were beaten 4-1 at Rochdale.
Away from the UK and John Bostock enjoyed a positive debut for Toronto FC in the MLS.
He earned the penalty for Robert Earnshaw to grab his second goal of the game as Toronto beat Sporting Kansas City 2-1 at the Rogers Centre. John completed 85 minutes.
In Germany, Heurelho Gomes had little to do as Hoffenheim picked up a key 2-0 win against bottom side Grenther Furth in the Bundesliga.
Bongani Khumalo started as PAOK won an eventful game in the Greek Super League, eventually finishing the match with nine men after two red cards but holding on for a 2-1 victory against Platanias.
Yago Falque started again as Almeria suffered a 3-2 home loss against Las Palmas in Spain's Segunda Division while Souleymane Coulibaly came on in the 60th minute and forced a save from goalkeeper Rafael as Grosseto went down 2-0 against Hellas Verona in Serie B in Italy.
The winger hit a spectacular 25-yarder that dipped into the top corner for Rangers' second goal in a 3-1 win against Sunderland at Loftus Road on Saturday.