Jordi Lopez and Darren Pratley battle for possession at Loftus Road
Mikele Leigertwood dented Swansea's play-off hopes by firing QPR to their first win in 10 matches.
After a scrappy start, Swansea were the first to threaten when Jordi Gomez twice shot at QPR keeper Radek Cerny.
But Rangers took the lead on 29 minutes when Jordi Lopez swung a free-kick into the area and Leigertwood headed home.
Gorka Pintado forced a smart near-post stop from Cerny as Swansea responded but Adel Taarabt and Heidar Helguson both had chances to extend QPR's lead.
QPR manager Paulo Sousa:
"We have had a lot of critics from outside and a lot of adversities but we are a team with a lot of unity, who were trying to get three points against the best football team.
"They are not easy to beat - you have to be very good to beat a team like Swansea.
"We have nine or 10 players injured, but I keep believing in what we can achieve with hard work."
Swansea manager Roberto Martinez:
"It was disappointing not to get the result we were looking for.
"We lost to a soft goal from a set-piece, and to lose in that way hurts.
"The boys showed the right reaction in the second half, and we deserved to get something out of the game.
"Overall, I don't think anyone deserved to win the game. A draw would have been a fair result, but Rangers took advantage of one set-piece."
QPR: Cerny, Gorkss, Ramage, Hall (Delaney 83), Connolly, Leigertwood, Lopez (Miller 87), Alberti, Taarabt, Ephraim, Di Carmine (Helguson 74).
Subs Not Used: Vine, German.
Booked: Leigertwood.
Goals: Leigertwood 30.
Swansea: De Vries, Williams, Monk, Serran, Rangel, Pratley, Gomez (Dyer 62), Allen (Britton 87), Butler, Pintado (Scotland 69), Bauza.
Subs Not Used: Orlandi, Collins.
Bookmark with:
What are these?