Check out the labeling feature in the properties window of the desired layer. You can set label size based upon map units or based upon a feature's field in the Advance tab. I don't know of any for-sure way to systematically set labels inside their parent feature, without tedious handwork.
Even ArcGIS's label engine, which is far superior in my opinion, I can't think of a easy solution.
You might also rethink your labeling approach. If you need it this way to get the point across you might be using the wrong symbology for your data presentation. A key/legend system might be easier and more relevant to the user.
Remember you are designing maps for your audience not yourself. Don't be afraid to tear the entire idea down and rebuild it.