The win saw Forest's unbeaten run extend to nine games in all competitions, with Steve Cooper's side moving to within one point of the play-off places with games in hand on teams above.
Queens Park Rangers remain just inside the play-off places, but one win in four games won't be inspiring Hoops fans.
Story of the game
The first chance of the match came in the ninth minute, courtesy of QPR. A clever pull-back from Andre Gray fell to Luke Amos, who miss-kicked the ball into the path of Lee Wallace, only a couple of yards from goal, but Ethan Horvath was alert to stick a foot out and make the save from Wallace's strike.
It was the 20th minute when Forest had their first chance of the game, and what a chance it was. Philip Zinckernagel managed to loop a ball over to Ryan Yates, whose header forced an incredible, point-blank save from David Marshall.
The resulting corner found its way to Zinckernagel out on the left, who managed to find Yates again. This time the ball ricocheted off Yates' heel and flashed across the face of goal from a yard or two out.
It was the substitute that set up the first goal of the game. Chair produced some neat trickery inside the Forest half before releasing Andre Gray, who turned Tobias Figueiredo and rattled the ball through Horvath's legs before running away to celebrate. Three goals in three games for the striker.
Forest could have been back in the game a few minutes later through a James Garner free-kick, but David Marshall was there to push the ball away before Keinan Davis was off balance to put the rebound wide.
Steve Cooper will have been hoping that his team would come out of the traps in the second half, but QPR were making it difficult for Forest. The R's had plenty of bodies back and the Reds were struggling to create any opportunities.
It was a foul, though, from Sam Field, that saw a quick free-kick find Zinckernagel, who laid the ball off to Djed Spence for Forest's equaliser. The 21-year-old may not score many better goals in his career after scoring a screamer from outside the box, just dipping underneath the crossbar.
Spence was again involved minutes later after successfully retaining the ball from a QPR attack before forcing Forest back up the pitch, although a great run was met with a missed hit from Brennan Johnson.
As the second half went on, QPR struggled to deal with the pace of Forest's players and found themselves on four yellow cards by the hour mark. As Lee Wallace was booked, Mark Warburton chose to freshen things up as Luke Amos and Andre Dozzell made way for Jeff Hendrick and Stefan Johansen.
As the game continued to ebb and flow, Steve Cooper made his first changes of the game in the 78th minute with Sam Surridge and Joe Lolley coming on for Scott McKenna and Keinan Davis, switching to a back four.
It was three minutes later when Joe Lolley made his first contribution to the game, finding Zinckernagel, who forced a spectacular save from Marshall for a corner.
The corner was swung in by James Garner, and Ryan Yates stabbed the ball into the back of the net, giving Forest the lead. Four goals in four games for the midfielder.
As soon as Forest took the lead, Cafu replaced Zinckernagel. Two minutes later, Surridge was released down the right-hand side and squared the ball to Cafu, who saw his strike saved by Marshall. The rebound found Brennan Johnson who smashed the ball into the back of the net, sealing the game up. 3-1.
Man of the match
With the equalising goal, two key passes, 85% pass accuracy and one big chance created, Spence sparked Forest's comeback and was a vital part of the win.
His goal was incredible, and he did everything to put Forest on the front foot, leading the way in defence and attack. The right-back is becoming unplayable, and Forest may not have come away with anything without him.