Но всю малину попортила строка "key: value (key: value)". В целом, её можно тупо порезать по "(", но верный ли такой подход?
Ну если по-быстрому, то почему бы и нет. Если более капитально, то все сводится к тому же: нужно бить строку на токены (QStringRef, в общем случае итератор), напр для строки выше список токенов
И разбор становится очевидным: первый токен ключ, второй двоеточие, третий значение. Если потом нужно будет заняться тем что в скобках - опять его в список токенов и.т.д. Обратите внимание что в случае ошибки легко будет показать (подсветить) где она.
Другой путь - освоение "моцных технологий", если знаете как записать какую-нибудь дустовскую сабру-кадабру, то выйдет покороче