I see that it is possible to create an abbreviations list, by using 'Apply label text substitutes' in the Labels Properties, but this abbreviates ALL labels. Is there a way to use the abbreviations only when required, ie. to fit labels on shorter roads and not abbreviate when there is enough room to show the full label?
you can use expression tool to build your label. You have to put your abbreviation in a field of the table, i.e. named "abbreviation".
With expression tool, that you find next to the label properties nemed "label with", you can set an expression to show abbreviation if the line string is lower than a length. For example if you want use abbreviation for line lower than 100 m you have to write:
CASE WHEN $length < 100 THEN "abbreviation" else "normal name" END
CASE operator checks if the line length is lower than 100 and if the test will return TRUE then it sets the label with the value in the "abbreviation" field else with the value in the "normal name" field.
You can also use this test:
CASE WHEN $length < (length("name") * 10) THEN "abbreviation" else "normal name" END
in this example it is supposed that the font size is 10 meters (it depends how you have set this parameter in the label properties). If the line length is lower than label length (in meters) then the label is set with the "abbreviation" else with the "normal name"