Достоточно строчки:
ui->textEdit->acceptRichText();
...что бы работать с html?
Этот метод возвращает true (по умолчанию) или false, если пользователю разрешается вставлять (из буфера обмена) или переносить (drag & drop, из браузера например) Rich Text. То есть с сохранением цветов, жирности, шрифта и прочее. Иначе вставляется как обычный текст (как в блокнот).
Вообще с этим QTextEdit дело ясное, что дело тёмное. Там такая замысловатая структура, что сам чёрт ногу сломит, а про обилие классов, которые всем этим управляют я вообще молчу. Вот например в чем разница, если я поставлю форматирование через тег "<span style="color: 'green'">Line 1</span>" или через такой код?:
C++ (Qt)
QTextDocument *document = edit->document();
QTextCursor cursor(document);
cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
QTextCharFormat format;
format.setForeground(Qt::green);
cursor.mergeCharFormat(format);
Вероятно в том, что во втором случае "html" код уже обработан и форматирование задано в "понятном" для Qt виде. Если мы захотим изменить цвет слова, то что большинство людей сделает? Добавит заново измененный "html" код или будет работать с классом QTextCharFormat? Если первый вариант влияет на состояние второго, то скорее всего, второй вариант никак не влияет на установленный html код. На экране видим белое по черному, а в html черное по белому.
Тут появляется класс QTextDocumentWriter. Ставим ему формат в котором будем сохранять writer.setFormat("HTML"). Загружать в QTextEdit обратно нужно будет уже через QFile. Всё бы ничего, но вот HTML не умеет хранить картинки или пользовательские текстовые объекты. Казалось бы решением мог бы быть "ODF", но пока в него можно только сохранить, а вот читать из него Qt еще не умеет. Жалко, что у QTextDocument нет поддержки QDataStream, жизнь бы упростилась.