Richard Walker opened the scoring for the visitors six minutes before the first half, looping in a header from David Vaughan's corner kick.
Then, moments before the break, Kenny Lunt set up Mark Rivers to score after an impressive four-man move.
Danny Shittu crashed in a header off the post from a corner after 81 minutes - but Crewe deservedly held on.
Crewe boss Dario Gradi:
"I didn't think we were terrific today, but by and large we
blocked them well.
"Their chances were all in front of us, they never got behind us and they played a lot of balls into our box which I don't think really works.
"We were more likely to get one on the break and Dean Ashton should have made it 3-0."
QPR: Day, Bignot, Shittu, Edghill, Padula (McLeod 54),
Rowlands, Bircham (Miller 65), Gallen, Cook (Ainsworth 63),
Best, Furlong.
Subs Not Used: Cole, Bean.
Booked: Furlong, Rowlands.
Goals: Shittu 81.
Crewe: Ince, Otsemobor, Foster, Walker, Moses, Lunt, Sorvel,
Bell (Cochrane 87), Vaughan, Ashton (White 90),
Rivers (Varney 79).
Subs Not Used: Williams, McCready.
Booked: Rivers, Moses.
Goals: Walker 39, Rivers 45.
Att: 15,770
Ref: C Penton (Sussex).