The 24-year-old Australian started on pole and finished coolly in the Catalonia heat.
It is a 1-2 for McLaren, with Piastri taking the win and his teammate, Norris, finishing comfortably in second.
Red Bull's Max Verstappen looked set to take third, but Leclerc sniped that from him before the end.
To add insult to injury, the Dutchman was then overtaken by Mercedes' George Russell.
Verstappen clipped the Brit's car and was retroactively given a 10-second penalty, leaving him in 10th.
Piastri's win in northern Spain consolidates his lead in the Formula 1 drivers' standings - from three points to 10.
Speaking after the race, Norris said: “Oscar drove very good today, I just didn’t have the pace to match him.
"It was a good, fun race. To finish 1-2 is even better.”
Top 10
Oscar Piastri (McLaren)
Lando Norris (McLaren)
Charles Leclerc (Ferrari)
George Russell (Mercedes)
Nico Hulkenberg (Kick Sauber)
Lewis Hamilton (Ferrari)
Isack Hadjar (Racing Bulls)
Pierre Gasly (Alpine)
Fernando Alonso (Aston Martin)
Max Verstappen (Red Bull)