В современных фреймверках, и в Qt в частности, работа с буфером обмена реализована на зачаточном уровне. Если в буфере обмена находится текст - то текст будет передан. Если в буфере обмена находится картинка - то картинка тоже будет передана. А что произойдет, если в буфере будет находиться и текст и изображение? Ничего хорошего! Не существует кроссплатформенных методов одномоментного получения из буфера обмена различных типов объектов. Поэтому, если выделить текст с картинками в браузере Firefox, и вставить текст в Microsoft Word, то Microsoft Word не сможет получить картинки из буфера обмена. Он пропарсит текст, найдет интернет-ссылки, и молча примется их закачивать. Создается впечатление, что Microsoft Word умеет копировать текст с картинками через буфер обмена, заполненный другой программой, но на деле это не так.
Моя программа для накопления информации MyTetra тоже не могла похвастаться копированием текста, содержащего картинки. Можно было скопировать и вставить отдельную картинку. Можно скопировать и вставить текст с картинками в пределах самой программы MyTetra. Но вставить текст с картинками из браузера небыло никакой возможности.
Недавно у меня состоялся такой разговор с пользователем PIM-менеджера CherryTree:
Пользователь:
Не могу сказать, когда это было реализовано. Но год назад, когда я начал пользоваться cheerytree, эта возможность уже была, что и определило мой выбор.
Я:
Посмотрел. Я-то думал, что, действительно, решена задача вставки из буфера текста + картинок. А на самом деле задача не решена. Они просто парсят вставляемый текст, и выкачивают картинки.
Соответственно, такое решение не работает:
- Если используется прокси. Картинки не копируются, так как прямого соединения с интернет нет;
- Если пропал интернет. То есть, в буфере картинки есть, но CherryTree не умеет доставать из буфера. Поэтому картинки будут потеряны;
- Если скопировать текст с картинками не из браузера, а из Libre/Open Office, то картинки тоже не будут вставлены. А все из-за того, что из буфера CherryTree доставать не умеет.
В общем, сделана полумера, от реализации которой я в свое время отказался, так как посчитал костылем. Но если народу нравится, и альтернатив нет, то наверно реализую вот так так же как у Cherry.
Я предпринял последнюю попытку разобраться с буфером обмена. Я думал, что может быть все-таки существует метод вычленения и текста и картинок из одного буфера. Я проштудировал все методы, которые дает Qt для работы с буфером обмена. Но оказалось, что такого функционала просто не предусмотрено. Я проделывал разные манипуляции с буфером обмена между разными программами и понял, что даже Microsoft не умеет работать с комбинированным буфером.
В соответствии с вышесказанным, мне пришлось отказаться от честной работы с буфером обмена, на которую я так расчитывал. И для решения вопроса о копировании текста с картинками из браузера, я сделал такой же механизм, как и в других программах. А именно: вычленение тегов картинок во вставляемом тексте, и подкачка их из сети. Вчера реализация этого механизма была завершена в ветке editorModification в коммите 71e6d9d.
Теперь, если выделить в браузере текст с картинками, то они будут подгружены в текст. Происходит это с помощью встроенного довнлоадера:
Вот, например, как выглядит запись, вставленная с Хабрахабра:
Довнлоадер умеет скачивать по HTTP, HTTPS, понимает редиректы (которые, например, используются на Хабрасторадже для хранения картинок).
Очередной шаг в развитии MyTetra сделан, и теперь я приступаю к исправлению косметических недочетов. Некоторые решаются просто, а некоторые могут потребовать больших усилий. Сейчас мне начал помогать фиксить баги один добрый человек из Питера, и я надеюсь, что работа пойдет быстрее, и релиз выйдет в ближайшее время.
Всем удачи.